From netch@iv.nn.kiev.ua  Sat Mar 27 09:46:20 2004
Return-Path: <netch@iv.nn.kiev.ua>
Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125])
	by hub.freebsd.org (Postfix) with ESMTP id B915116A4CF
	for <FreeBSD-gnats-submit@freebsd.org>; Sat, 27 Mar 2004 09:46:20 -0800 (PST)
Received: from segfault.kiev.ua (segfault.kiev.ua [193.193.193.4])
	by mx1.FreeBSD.org (Postfix) with ESMTP id B7DA743D3F
	for <FreeBSD-gnats-submit@freebsd.org>; Sat, 27 Mar 2004 09:46:19 -0800 (PST)
	(envelope-from netch@iv.nn.kiev.ua)
Received: (from uucp@localhost)
	by segfault.kiev.ua (8) with UUCP id i2RHkI8B007482;
	Sat, 27 Mar 2004 19:46:18 +0200 (EET)
	(envelope-from netch@iv.nn.kiev.ua)
Received: (from root@localhost)
	by iv.nn.kiev.ua (8.12.9p2/8.12.9) id i2RHjNew005761;
	Sat, 27 Mar 2004 19:45:23 +0200 (EET)
	(envelope-from netch)
Message-Id: <200403271745.i2RHjNew005761@iv.nn.kiev.ua>
Date: Sat, 27 Mar 2004 19:45:23 +0200 (EET)
From: Valentin Nechayev <netch@netch.kiev.ua>
Reply-To: Valentin Nechayev <netch@netch.kiev.ua>
To: FreeBSD-gnats-submit@freebsd.org
Cc:
Subject: systat can't display big numbers in some fields
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         64811
>Category:       bin
>Synopsis:       systat can't display big numbers in some fields
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sat Mar 27 09:50:00 PST 2004
>Closed-Date:    Tue Feb 12 23:28:52 UTC 2008
>Last-Modified:  Tue Feb 12 23:28:52 UTC 2008
>Originator:     Valentin Nechayev
>Release:        FreeBSD 4.9-RELEASE i386
>Organization:
home sweet home
>Environment:
System: FreeBSD iv.nn.kiev.ua 4.9-RELEASE FreeBSD 4.9-RELEASE #2: Thu Mar 18 07:24:01 EET 2004 root@iv.nn.kiev.ua:/var2/usr/obj/sys4/nn14 i386

>Description:

I say only for vmstat page, but this can be valid for other pages and
other fields.
It isn't rare now see huge syscalls, traps, context switches... count.
My home system which is almost obsolete now (Cel800, i815E) allows 1.7
millions of simple syscalls per second. systat can't show 100000 or more;
and five-digit values (10000...99999) aren't separated from neighbours.

>How-To-Repeat:

Run systat & a program which getpid()s in forever cycle.

>Fix:

Following shows big numbers in radiotechnic style: 13400 -> 13k4,
1234567 -> 1m234...
Number cells in counters line are reduced to have space separator.

This may be applicable to other fields, in case they overflow.

Format selection works correctly only if width >= 4.

--- src/usr.bin/systat/vmstat.c.0	Tue Apr  2 23:11:59 2002
+++ src/usr.bin/systat/vmstat.c	Sat Mar 27 19:34:20 2004
@@ -518,20 +518,20 @@
 	putint(s.desiredvnodes, VMSTATROW + 15, VMSTATCOL, 9);
 	putint(s.numvnodes, VMSTATROW + 16, VMSTATCOL, 9);
 	putint(s.freevnodes, VMSTATROW + 17, VMSTATCOL, 9);
-	PUTRATE(Cnt.v_vnodein, PAGEROW + 2, PAGECOL + 5, 5);
-	PUTRATE(Cnt.v_vnodeout, PAGEROW + 2, PAGECOL + 10, 5);
-	PUTRATE(Cnt.v_swapin, PAGEROW + 2, PAGECOL + 17, 5);
-	PUTRATE(Cnt.v_swapout, PAGEROW + 2, PAGECOL + 22, 5);
-	PUTRATE(Cnt.v_vnodepgsin, PAGEROW + 3, PAGECOL + 5, 5);
-	PUTRATE(Cnt.v_vnodepgsout, PAGEROW + 3, PAGECOL + 10, 5);
-	PUTRATE(Cnt.v_swappgsin, PAGEROW + 3, PAGECOL + 17, 5);
-	PUTRATE(Cnt.v_swappgsout, PAGEROW + 3, PAGECOL + 22, 5);
-	PUTRATE(Cnt.v_swtch, GENSTATROW + 1, GENSTATCOL, 5);
-	PUTRATE(Cnt.v_trap, GENSTATROW + 1, GENSTATCOL + 5, 5);
-	PUTRATE(Cnt.v_syscall, GENSTATROW + 1, GENSTATCOL + 10, 5);
-	PUTRATE(Cnt.v_intr, GENSTATROW + 1, GENSTATCOL + 15, 5);
-	PUTRATE(Cnt.v_soft, GENSTATROW + 1, GENSTATCOL + 20, 5);
-	PUTRATE(Cnt.v_vm_faults, GENSTATROW + 1, GENSTATCOL + 25, 5);
+	PUTRATE(Cnt.v_vnodein, PAGEROW + 2, PAGECOL + 5, 4);
+	PUTRATE(Cnt.v_vnodeout, PAGEROW + 2, PAGECOL + 10, 4);
+	PUTRATE(Cnt.v_swapin, PAGEROW + 2, PAGECOL + 17, 4);
+	PUTRATE(Cnt.v_swapout, PAGEROW + 2, PAGECOL + 22, 4);
+	PUTRATE(Cnt.v_vnodepgsin, PAGEROW + 3, PAGECOL + 5, 4);
+	PUTRATE(Cnt.v_vnodepgsout, PAGEROW + 3, PAGECOL + 10, 4);
+	PUTRATE(Cnt.v_swappgsin, PAGEROW + 3, PAGECOL + 17, 4);
+	PUTRATE(Cnt.v_swappgsout, PAGEROW + 3, PAGECOL + 22, 4);
+	PUTRATE(Cnt.v_swtch, GENSTATROW + 1, GENSTATCOL + 1, 4);
+	PUTRATE(Cnt.v_trap, GENSTATROW + 1, GENSTATCOL + 6, 4);
+	PUTRATE(Cnt.v_syscall, GENSTATROW + 1, GENSTATCOL + 11, 4);
+	PUTRATE(Cnt.v_intr, GENSTATROW + 1, GENSTATCOL + 16, 4);
+	PUTRATE(Cnt.v_soft, GENSTATROW + 1, GENSTATCOL + 21, 4);
+	PUTRATE(Cnt.v_vm_faults, GENSTATROW + 1, GENSTATCOL + 25, 4);
 	mvprintw(DISKROW, DISKCOL + 5, "                              ");
 	for (i = 0, c = 0; i < num_devices && c < MAXDRIVES; i++)
 		if (dev_select[i].selected) {
@@ -665,6 +665,7 @@
 	int n, l, c, w;
 {
 	char b[128];
+	size_t ll;
 
 	move(l, c);
 	if (n == 0) {
@@ -672,8 +673,20 @@
 			addch(' ');
 		return;
 	}
-	snprintf(b, sizeof(b), "%*d", w, n);
-	if (strlen(b) > w) {
+	ll = snprintf(b, sizeof(b), "%*d", w, n);
+	if (ll > w && n >= 1000 && n < 1000000) {	/* kilo */
+		div_t d = div(n,1000);
+		snprintf(b, sizeof b, "%dk%-*d", d.quot, w, d.rem);
+		b[w] = 0;
+		ll = strchr(b, 'k') ? w : w + 1;
+	}
+	if (ll > w && n >= 1000000 && n < 1000000000) {	/* mega */
+		div_t d = div(n,1000000);
+		snprintf(b, sizeof b, "%dm%-*d", d.quot, w, d.rem);
+		b[w] = 0;
+		ll = strchr(b, 'm') ? w : w + 1;
+	}
+	if (ll > w) {
 		while (w-- > 0)
 			addch('*');
 		return;
>Release-Note:
>Audit-Trail:

From: Valentin Nechayev <netch@netch.kiev.ua>
To: FreeBSD-gnats-submit@freebsd.org
Cc:  
Subject: Re: bin/64811: systat can't display big numbers in some fields
Date: Sat, 27 Mar 2004 21:34:18 +0200

 VN> +		snprintf(b, sizeof b, "%dm%-*d", d.quot, w, d.rem);
                                          ^
 s/m/M/, according to usual style (k - kilo, M - mega)
 
 
 -netch-

From: Volker <volker@vwsoft.com>
To: bug-followup@FreeBSD.org, netch@netch.kiev.ua
Cc:  
Subject: Re: bin/64811: systat can't display big numbers in some fields
Date: Tue, 12 Feb 2008 23:31:35 +0100

 A similar patch has been brought into the system with vmstat.c rev
 1.58 and up. RELENG_5 and later does what the PR submitter wanted.
 
 I assume we can close this PR?
State-Changed-From-To: open->feedback 
State-Changed-By: linimon 
State-Changed-When: Tue Feb 12 23:00:47 UTC 2008 
State-Changed-Why:  
Note that submitter has been asked for feedback. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=64811 

From: Valentin Nechayev <netch@netch.kiev.ua>
To: Volker <volker@vwsoft.com>
Cc: bug-followup@FreeBSD.org
Subject: Re: bin/64811: systat can't display big numbers in some fields
Date: Wed, 13 Feb 2008 01:05:57 +0200

 Hi,
 
  Tue, Feb 12, 2008 at 23:31:35, volker wrote about "Re: bin/64811: systat can't display big numbers in some fields": 
 
 > A similar patch has been brought into the system with vmstat.c rev
 > 1.58 and up. RELENG_5 and later does what the PR submitter wanted.
 > 
 > I assume we can close this PR?
 
 I've seen changes in systat. Yes, it's similar to my ones (in main concept)
 but it doesn't leave spaces between values. I'd like to see more ergonomic
 implementation. But, conceptually, it's fixed.
 
 
 -netch-
State-Changed-From-To: feedback->closed 
State-Changed-By: linimon 
State-Changed-When: Tue Feb 12 23:28:28 UTC 2008 
State-Changed-Why:  
Submitter confirms that a similar (but not exact) fix has been committed. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=64811 
>Unformatted:
