Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 18 Jul 2011 21:15:47 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r224205 - in head: contrib/top usr.bin/top
Message-ID:  <201107182115.p6ILFlGL039704@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201107182115.p6ILFlGL039704>