Proc data structure management, env gutting
[akaros.git] / kern / src / resource.c
index de53a4f..1f18c5e 100644 (file)
@@ -15,6 +15,7 @@
 #include <stdio.h>
 #include <assert.h>
 #include <schedule.h>
+#include <hashtable.h>
 
 /* This deals with a request for more cores.  The request is already stored in
  * the proc's amt_wanted (it is compared to amt_granted). 
@@ -136,11 +137,12 @@ ssize_t core_request(struct proc *p)
        return num_granted;
 }
 
-error_t resource_req(struct proc *p, int type, size_t amount, uint32_t flags)
+error_t resource_req(struct proc *p, int type, size_t amt_wanted,
+                     size_t amt_wanted_min, uint32_t flags)
 {
        error_t retval;
-       printk("Received request for type: %d, amount: %d, flag: %d\n",
-              type, amount, flags);
+       printk("Received request for type: %d, amt_wanted: %d, amt_wanted_min: %d, "
+              "flag: %d\n", type, amt_wanted, amt_wanted_min, flags);
        if (flags & REQ_ASYNC)
                // We have no sense of time yet, or of half-filling requests
                printk("[kernel] Async requests treated synchronously for now.\n");
@@ -148,12 +150,13 @@ error_t resource_req(struct proc *p, int type, size_t amount, uint32_t flags)
        /* set the desired resource amount in the process's resource list. */
        spin_lock_irqsave(&p->proc_lock);
        size_t old_amount = p->resources[type].amt_wanted;
-       p->resources[type].amt_wanted = amount;
+       p->resources[type].amt_wanted = amt_wanted;
+       p->resources[type].amt_wanted_min = MIN(amt_wanted_min, amt_wanted);
        p->resources[type].flags = flags;
        spin_unlock_irqsave(&p->proc_lock);
 
        // no change in the amt_wanted
-       if (old_amount == amount)
+       if (old_amount == amt_wanted)
                return 0;
 
        switch (type) {
@@ -183,17 +186,21 @@ error_t resource_req(struct proc *p, int type, size_t amount, uint32_t flags)
 void print_resources(struct proc *p)
 {
        printk("--------------------\n");
-       printk("PID: %d\n", p->env_id);
+       printk("PID: %d\n", p->pid);
        printk("--------------------\n");
        for (int i = 0; i < MAX_NUM_RESOURCES; i++)
                printk("Res type: %02d, amt wanted: %08d, amt granted: %08d\n", i,
                       p->resources[i].amt_wanted, p->resources[i].amt_granted);
 }
 
-/* TODO: change this when we get rid of the env array */
 void print_all_resources(void)
 {
-       for (int i = 0; i < NENV; i++)
-               if (envs[i].state != ENV_FREE)
-                       print_resources(&envs[i]);
+       spin_lock(&pid_hash_lock);
+       if (hashtable_count(pid_hash)) {
+               hashtable_itr_t *phtable_i = hashtable_iterator(pid_hash);
+               do {
+                       print_resources(hashtable_iterator_value(phtable_i));
+               } while (hashtable_iterator_advance(phtable_i));
+       }
+       spin_unlock(&pid_hash_lock);
 }