Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/sysinfo/stats.c

    ra0ce870 r96b02eb9  
    170170         * Note that it may be infinitely better to let the address space
    171171         * management code compute these statistics as it proceeds instead of
    172          * having them calculated over and over again here.
     172         * having them calculated here over and over again here.
    173173         */
    174174
     
    199199}
    200200
    201 /** Get the resident (used) size of a virtual address space
    202  *
    203  * @param as Address space.
    204  *
    205  * @return Size of the resident (used) virtual address space (bytes).
    206  *
    207  */
    208 static size_t get_task_resmem(as_t *as)
    209 {
    210         size_t result = 0;
    211        
    212         /*
    213          * We are holding some spinlocks here and therefore are not allowed to
    214          * block. Only attempt to lock the address space and address space area
    215          * mutexes conditionally. If it is not possible to lock either object,
    216          * allow the statistics to be inexact by skipping the respective object.
    217          *
    218          * Note that it may be infinitely better to let the address space
    219          * management code compute these statistics as it proceeds instead of
    220          * having them calculated over and over again here.
    221          */
    222        
    223         if (SYNCH_FAILED(mutex_trylock(&as->lock)))
    224                 return result * PAGE_SIZE;
    225        
    226         /* Walk the B+ tree of AS areas */
    227         link_t *cur;
    228         for (cur = as->as_area_btree.leaf_head.next;
    229             cur != &as->as_area_btree.leaf_head; cur = cur->next) {
    230                 btree_node_t *node =
    231                     list_get_instance(cur, btree_node_t, leaf_link);
    232                
    233                 unsigned int i;
    234                 for (i = 0; i < node->keys; i++) {
    235                         as_area_t *area = node->value[i];
    236                        
    237                         if (SYNCH_FAILED(mutex_trylock(&area->lock)))
    238                                 continue;
    239                        
    240                         /* Walk the B+ tree of resident pages */
    241                         link_t *rcur;
    242                         for (rcur = area->used_space.leaf_head.next;
    243                             rcur != &area->used_space.leaf_head; rcur = rcur->next) {
    244                                 btree_node_t *rnode =
    245                                     list_get_instance(rcur, btree_node_t, leaf_link);
    246                                
    247                                 unsigned int j;
    248                                 for (j = 0; j < rnode->keys; j++)
    249                                         result += (size_t) rnode->value[i];
    250                         }
    251                        
    252                         mutex_unlock(&area->lock);
    253                 }
    254         }
    255        
    256         mutex_unlock(&as->lock);
    257        
    258         return result * PAGE_SIZE;
    259 }
    260 
    261201/* Produce task statistics
    262202 *
     
    275215        str_cpy(stats_task->name, TASK_NAME_BUFLEN, task->name);
    276216        stats_task->virtmem = get_task_virtmem(task->as);
    277         stats_task->resmem = get_task_resmem(task->as);
    278217        stats_task->threads = atomic_get(&task->refcount);
    279218        task_get_accounting(task, &(stats_task->ucycles),
Note: See TracChangeset for help on using the changeset viewer.