mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-02 12:20:51 +00:00
systat: use and correctly display 64bit counters.
Following struct vmtotal changes, make systat use and correctly display 64-bit counters. Switch to humanize_number(3) to overcome homegrown arithmetics limits in pretty printing large numbers. Use 1024 as a divisor for memory fields to make it consistent with other tools and users expectations. Submitted by: Pawel Biernacki <pawel.biernacki@gmail.com> Sponsored by: Mysterious Code Ltd. PR: 2137 Differential revision: https://reviews.freebsd.org/D13105
This commit is contained in:
parent
063e16324b
commit
90dd3e79cc
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=326073
@ -16,6 +16,6 @@ CFLAGS+= -DINET6
|
||||
|
||||
WARNS?= 1
|
||||
|
||||
LIBADD= ncursesw m devstat kvm
|
||||
LIBADD= ncursesw m devstat kvm util
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
|
@ -57,6 +57,7 @@ static const char sccsid[] = "@(#)vmstat.c 8.2 (Berkeley) 1/12/94";
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
#include <langinfo.h>
|
||||
#include <libutil.h>
|
||||
#include <nlist.h>
|
||||
#include <paths.h>
|
||||
#include <signal.h>
|
||||
@ -131,6 +132,7 @@ struct statinfo cur, last, run;
|
||||
#define oldnchtotal s1.nchstats
|
||||
|
||||
static enum state { BOOT, TIME, RUN } state = TIME;
|
||||
enum divisor { IEC = 0, SI = HN_DIVISOR_1000 };
|
||||
|
||||
static void allocinfo(struct Info *);
|
||||
static void copyinfo(struct Info *, struct Info *);
|
||||
@ -138,6 +140,8 @@ static float cputime(int);
|
||||
static void dinfo(int, int, struct statinfo *, struct statinfo *);
|
||||
static void getinfo(struct Info *);
|
||||
static void putint(int, int, int, int);
|
||||
static void putuint64(uint64_t, int, int, int);
|
||||
static void do_putuint64(uint64_t, int, int, int, int);
|
||||
static void putfloat(double, int, int, int, int, int);
|
||||
static void putlongdouble(long double, int, int, int, int, int);
|
||||
static int ucount(void);
|
||||
@ -491,15 +495,15 @@ showkre(void)
|
||||
putfloat(100.0 * s.v_kmem_map_size / kmem_size,
|
||||
STATROW + 1, STATCOL + 22, 2, 0, 1);
|
||||
|
||||
putint(pgtokb(total.t_arm), MEMROW + 2, MEMCOL + 4, 7);
|
||||
putint(pgtokb(total.t_armshr), MEMROW + 2, MEMCOL + 12, 7);
|
||||
putint(pgtokb(total.t_avm), MEMROW + 2, MEMCOL + 20, 8);
|
||||
putint(pgtokb(total.t_avmshr), MEMROW + 2, MEMCOL + 29, 8);
|
||||
putint(pgtokb(total.t_rm), MEMROW + 3, MEMCOL + 4, 7);
|
||||
putint(pgtokb(total.t_rmshr), MEMROW + 3, MEMCOL + 12, 7);
|
||||
putint(pgtokb(total.t_vm), MEMROW + 3, MEMCOL + 20, 8);
|
||||
putint(pgtokb(total.t_vmshr), MEMROW + 3, MEMCOL + 29, 8);
|
||||
putint(pgtokb(total.t_free), MEMROW + 2, MEMCOL + 38, 7);
|
||||
putuint64(pgtokb(total.t_arm), MEMROW + 2, MEMCOL + 4, 7);
|
||||
putuint64(pgtokb(total.t_armshr), MEMROW + 2, MEMCOL + 12, 7);
|
||||
putuint64(pgtokb(total.t_avm), MEMROW + 2, MEMCOL + 20, 8);
|
||||
putuint64(pgtokb(total.t_avmshr), MEMROW + 2, MEMCOL + 29, 8);
|
||||
putuint64(pgtokb(total.t_rm), MEMROW + 3, MEMCOL + 4, 7);
|
||||
putuint64(pgtokb(total.t_rmshr), MEMROW + 3, MEMCOL + 12, 7);
|
||||
putuint64(pgtokb(total.t_vm), MEMROW + 3, MEMCOL + 20, 8);
|
||||
putuint64(pgtokb(total.t_vmshr), MEMROW + 3, MEMCOL + 29, 8);
|
||||
putuint64(pgtokb(total.t_free), MEMROW + 2, MEMCOL + 38, 7);
|
||||
putint(total.t_rq - 1, PROCSROW + 2, PROCSCOL, 3);
|
||||
putint(total.t_pw, PROCSROW + 2, PROCSCOL + 4, 3);
|
||||
putint(total.t_dw, PROCSROW + 2, PROCSCOL + 8, 3);
|
||||
@ -518,13 +522,13 @@ showkre(void)
|
||||
PUTRATE(v_pdwakeups, VMSTATROW + 9, VMSTATCOL, 8);
|
||||
PUTRATE(v_pdpages, VMSTATROW + 10, VMSTATCOL, 8);
|
||||
PUTRATE(v_intrans, VMSTATROW + 11, VMSTATCOL, 8);
|
||||
putint(pgtokb(s.v_wire_count), VMSTATROW + 12, VMSTATCOL, 8);
|
||||
putint(pgtokb(s.v_active_count), VMSTATROW + 13, VMSTATCOL, 8);
|
||||
putint(pgtokb(s.v_inactive_count), VMSTATROW + 14, VMSTATCOL, 8);
|
||||
putint(pgtokb(s.v_laundry_count), VMSTATROW + 15, VMSTATCOL, 8);
|
||||
putint(pgtokb(s.v_free_count), VMSTATROW + 16, VMSTATCOL, 8);
|
||||
putuint64(pgtokb(s.v_wire_count), VMSTATROW + 12, VMSTATCOL, 8);
|
||||
putuint64(pgtokb(s.v_active_count), VMSTATROW + 13, VMSTATCOL, 8);
|
||||
putuint64(pgtokb(s.v_inactive_count), VMSTATROW + 14, VMSTATCOL, 8);
|
||||
putuint64(pgtokb(s.v_laundry_count), VMSTATROW + 15, VMSTATCOL, 8);
|
||||
putuint64(pgtokb(s.v_free_count), VMSTATROW + 16, VMSTATCOL, 8);
|
||||
if (LINES - 1 > VMSTATROW + 17)
|
||||
putint(s.bufspace / 1024, VMSTATROW + 17, VMSTATCOL, 8);
|
||||
putuint64(s.bufspace / 1024, VMSTATROW + 17, VMSTATCOL, 8);
|
||||
PUTRATE(v_vnodein, PAGEROW + 2, PAGECOL + 6, 5);
|
||||
PUTRATE(v_vnodeout, PAGEROW + 2, PAGECOL + 12, 5);
|
||||
PUTRATE(v_swapin, PAGEROW + 2, PAGECOL + 19, 5);
|
||||
@ -665,9 +669,24 @@ cputime(int indx)
|
||||
|
||||
static void
|
||||
putint(int n, int l, int lc, int w)
|
||||
{
|
||||
|
||||
do_putuint64(n, l, lc, w, SI);
|
||||
}
|
||||
|
||||
static void
|
||||
putuint64(uint64_t n, int l, int lc, int w)
|
||||
{
|
||||
|
||||
do_putuint64(n, l, lc, w, IEC);
|
||||
}
|
||||
|
||||
static void
|
||||
do_putuint64(uint64_t n, int l, int lc, int w, int div)
|
||||
{
|
||||
int snr;
|
||||
char b[128];
|
||||
char buf[128];
|
||||
|
||||
move(l, lc);
|
||||
#ifdef DEBUG
|
||||
@ -680,11 +699,12 @@ putint(int n, int l, int lc, int w)
|
||||
addch(' ');
|
||||
return;
|
||||
}
|
||||
snr = snprintf(b, sizeof(b), "%*d", w, n);
|
||||
if (snr != w)
|
||||
snr = snprintf(b, sizeof(b), "%*dk", w - 1, n / 1000);
|
||||
if (snr != w)
|
||||
snr = snprintf(b, sizeof(b), "%*dM", w - 1, n / 1000000);
|
||||
snr = snprintf(b, sizeof(b), "%*jd", w, (uintmax_t)n);
|
||||
if (snr != w) {
|
||||
humanize_number(buf, w, n, "", HN_AUTOSCALE,
|
||||
HN_NOSPACE | HN_DECIMAL | div);
|
||||
snr = snprintf(b, sizeof(b), "%*s", w, buf);
|
||||
}
|
||||
if (snr != w) {
|
||||
while (w-- > 0)
|
||||
addch('*');
|
||||
|
Loading…
Reference in New Issue
Block a user