Author: jhb
Date: Mon Jul 18 21:15:47 2011
New Revision: 224205
URL: http://svn.freebsd.org/changeset/base/224205

Log:
  Rework the dynamic per-CPU stats code a bit.  Always set 'statics->ncpus'
  to the maximum number of CPUs to ensure that lcpustates[] array is always
  allocated to the maximum size.  Previously, if top was started without
  per-CPU stats it would allocate a smaller lcpustates[] array.  When
  per-CPU stats were then enabled, it would overflow the array and trash
  the cpustates_columns[] array causing the CPU stats to be printed in the
  wrong locations.
  
  Approved by:  re (kib)
  MFC after:    1 week

Modified:
  head/contrib/top/display.c
  head/contrib/top/top.c
  head/usr.bin/top/machine.c

Modified: head/contrib/top/display.c
==============================================================================
--- head/contrib/top/display.c  Mon Jul 18 21:08:14 2011        (r224204)
+++ head/contrib/top/display.c  Mon Jul 18 21:15:47 2011        (r224205)
@@ -156,18 +156,30 @@ int display_updatecpus(statics)
 struct statics *statics;
 
 {
+    register int *lp;
     register int lines;
     register int i;
     
     /* call resize to do the dirty work */
     lines = display_resize();
-    num_cpus = statics->ncpus;
+    if (pcpu_stats)
+       num_cpus = statics->ncpus;
+    else
+       num_cpus = 1;
     cpustates_column = 5;      /* CPU: */
     if (num_cpus != 1)
     cpustates_column += 2;     /* CPU 0: */
     for (i = num_cpus; i > 9; i /= 10)
        cpustates_column++;
 
+    /* fill the "last" array with all -1s, to insure correct updating */
+    lp = lcpustates;
+    i = num_cpustates * num_cpus;
+    while (--i >= 0)
+    {
+       *lp++ = -1;
+    }
+    
     return(lines);
 }
     
@@ -197,7 +209,7 @@ struct statics *statics;
        num_swap = string_count(swap_names);
        lswap = (int *)malloc(num_swap * sizeof(int));
        num_cpustates = string_count(cpustate_names);
-       lcpustates = (int *)malloc(num_cpustates * sizeof(int) * num_cpus);
+       lcpustates = (int *)malloc(num_cpustates * sizeof(int) * 
statics->ncpus);
        cpustate_columns = (int *)malloc(num_cpustates * sizeof(int));
 
        memory_names = statics->memory_names;

Modified: head/contrib/top/top.c
==============================================================================
--- head/contrib/top/top.c      Mon Jul 18 21:08:14 2011        (r224204)
+++ head/contrib/top/top.c      Mon Jul 18 21:15:47 2011        (r224205)
@@ -1094,7 +1094,7 @@ restart:
                                new_message(MT_standout | MT_delayed,
                                    " Displaying %sCPU statistics.",
                                    pcpu_stats ? "per-" : "global ");
-                               toggle_pcpustats(&statics);
+                               toggle_pcpustats();
                                max_topn = display_updatecpus(&statics);
                                reset_display();
                                putchar('\r');

Modified: head/usr.bin/top/machine.c
==============================================================================
--- head/usr.bin/top/machine.c  Mon Jul 18 21:08:14 2011        (r224204)
+++ head/usr.bin/top/machine.c  Mon Jul 18 21:15:47 2011        (r224205)
@@ -241,7 +241,7 @@ static void getsysctl(const char *name, 
 static int swapmode(int *retavail, int *retfree);
 
 void
-toggle_pcpustats(struct statics *statics)
+toggle_pcpustats(void)
 {
 
        if (ncpus == 1)
@@ -256,7 +256,6 @@ toggle_pcpustats(struct statics *statics
                y_header += ncpus - 1;  /* 6 */
                y_procs += ncpus - 1;   /* 7 */
                Header_lines += ncpus - 1; /* 7 */
-               statics->ncpus = ncpus;
        } else {
                y_mem = 3;
                y_swap = 4;
@@ -265,7 +264,6 @@ toggle_pcpustats(struct statics *statics
                y_header = 6;
                y_procs = 7;
                Header_lines = 7;
-               statics->ncpus = 1;
        }
 }
 
@@ -356,10 +354,10 @@ machine_init(struct statics *statics, ch
        pcpu_cp_old = calloc(1, size);
        pcpu_cp_diff = calloc(1, size);
        pcpu_cpu_states = calloc(1, size);
-       statics->ncpus = 1;
+       statics->ncpus = ncpus;
 
        if (pcpu_stats)
-               toggle_pcpustats(statics);
+               toggle_pcpustats();
 
        /* all done! */
        return (0);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to