]> git.itanic.dy.fi Git - scan-pagemap/commitdiff
analyzer: print_pid_stats: Sort process list by mem usage
authorTimo Kokkonen <kaapeli@itanic.dy.fi>
Mon, 5 Jul 2010 21:16:44 +0000 (00:16 +0300)
committerTimo Kokkonen <kaapeli@itanic.dy.fi>
Mon, 5 Jul 2010 21:16:44 +0000 (00:16 +0300)
Signed-off-by: Timo Kokkonen <kaapeli@itanic.dy.fi>
analyze.c

index 59772b51d78fed662c2e08f9bb2553efb4a4ab84..06b5722ff89b5cf5f4c13f09fafaf7859543bf40 100644 (file)
--- a/analyze.c
+++ b/analyze.c
@@ -81,19 +81,29 @@ void print_page_stats(struct pageframe *pf)
 void print_pid_stats(struct pageframe *pf, struct process *process_list)
 {
        struct process *ps;
-       struct maps *map;
        long int swapped, present;
+       long int biggest = 0, second_biggest;
+       int count;
+
+       list_for_each_entry(ps, &process_list->list, list)
+               biggest = MAX(biggest, ps->pages_present);
 
        printf("   in ram   swapped    pid name\n");
 
+restart:
+       second_biggest = 0;
+       count = 0;
        list_for_each_entry(ps, &process_list->list, list) {
-               swapped = present = 0;
 
-               if (ps->maps)
-                       list_for_each_entry(map, &ps->maps->list, list) {
-                               present += map->pages_present;
-                               swapped += map->pages_swapped;
-                       }
+               present = ps->pages_present;
+               swapped = ps->pages_swapped;
+
+               second_biggest = ps->pages_present < biggest &&
+                       second_biggest < ps->pages_present ?
+                       ps->pages_present : second_biggest;
+
+               if (ps->pages_present != biggest)
+                       continue;
 
                if ((swapped + present) == 0)
                        continue;
@@ -102,5 +112,11 @@ void print_pid_stats(struct pageframe *pf, struct process *process_list)
                        PAGE_TO_NICE(present), PAGE_TO_NICE_UNIT(present),
                        PAGE_TO_NICE(swapped), PAGE_TO_NICE_UNIT(swapped),
                        ps->pid, ps->name);
+               count++;
+       }
+
+       if (count > 0) {
+               biggest = second_biggest;
+               goto restart;
        }
 }