Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 24 Mar 2011 20:15:42 +0000 (UTC)
From:      Edward Tomasz Napierala <trasz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r219972 - head/bin/ps
Message-ID:  <201103242015.p2OKFgjL056208@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: trasz
Date: Thu Mar 24 20:15:42 2011
New Revision: 219972
URL: http://svn.freebsd.org/changeset/base/219972

Log:
  Add proper width calculation for time fields (time, cputime and usertime).
  This fixes the ugly overflow in "ps aux" output for "[idle]".

Modified:
  head/bin/ps/extern.h
  head/bin/ps/keyword.c
  head/bin/ps/print.c

Modified: head/bin/ps/extern.h
==============================================================================
--- head/bin/ps/extern.h	Thu Mar 24 19:50:34 2011	(r219971)
+++ head/bin/ps/extern.h	Thu Mar 24 20:15:42 2011	(r219972)
@@ -74,12 +74,15 @@ void	 rgroupname(KINFO *, VARENT *);
 void	 runame(KINFO *, VARENT *);
 void	 rvar(KINFO *, VARENT *);
 int	 s_comm(KINFO *);
+int	 s_cputime(KINFO *);
 int	 s_label(KINFO *);
 int	 s_loginclass(KINFO *);
 int	 s_logname(KINFO *);
 int	 s_rgroupname(KINFO *);
 int	 s_runame(KINFO *);
+int	 s_systime(KINFO *);
 int	 s_uname(KINFO *);
+int	 s_usertime(KINFO *);
 void	 showkey(void);
 void	 started(KINFO *, VARENT *);
 void	 state(KINFO *, VARENT *);

Modified: head/bin/ps/keyword.c
==============================================================================
--- head/bin/ps/keyword.c	Thu Mar 24 19:50:34 2011	(r219971)
+++ head/bin/ps/keyword.c	Thu Mar 24 20:15:42 2011	(r219972)
@@ -189,12 +189,14 @@ static VAR var[] = {
 		UINT, UIDFMT, 0},
 	{"svuid", "SVUID", NULL, 0, kvar, NULL, UIDLEN, KOFF(ki_svuid),
 		UINT, UIDFMT, 0},
-	{"systime", "SYSTIME", NULL, USER, systime, NULL, 9, 0, CHAR, NULL, 0},
+	{"systime", "SYSTIME", NULL, USER|DSIZ, systime, s_systime, 15, 0, CHAR,
+		NULL, 0},
 	{"tdaddr", "TDADDR", NULL, 0, kvar, NULL, sizeof(void *) * 2,
 		KOFF(ki_tdaddr), KPTR, "lx", 0},
 	{"tdev", "TDEV", NULL, 0, tdev, NULL, 5, 0, CHAR, NULL, 0},
 	{"tdnam", "TDNAM", NULL, LJUST, tdnam, NULL, COMMLEN, 0, CHAR, NULL, 0},
-	{"time", "TIME", NULL, USER, cputime, NULL, 9, 0, CHAR, NULL, 0},
+	{"time", "TIME", NULL, USER|DSIZ, cputime, s_cputime, 15, 0, CHAR,
+		NULL, 0},
 	{"tpgid", "TPGID", NULL, 0, kvar, NULL, 4, KOFF(ki_tpgid), UINT,
 		PIDFMT, 0},
 	{"tsid", "TSID", NULL, 0, kvar, NULL, PIDLEN, KOFF(ki_tsid), UINT,
@@ -211,8 +213,8 @@ static VAR var[] = {
 		KOFF(ki_paddr), KPTR, "lx", 0},
 	{"user", "USER", NULL, LJUST|DSIZ, uname, s_uname, USERLEN, 0, CHAR,
 		NULL, 0},
-	{"usertime", "USERTIME", NULL, USER, usertime, NULL, 9, 0, CHAR, NULL,
-		0},
+	{"usertime", "USERTIME", NULL, USER|DSIZ, usertime, s_usertime, 15, 0,
+		CHAR, NULL, 0},
 	{"usrpri", "", "upr", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
 	{"vsize", "", "vsz", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
 	{"vsz", "VSZ", NULL, 0, vsize, NULL, 6, 0, CHAR, NULL, 0},

Modified: head/bin/ps/print.c
==============================================================================
--- head/bin/ps/print.c	Thu Mar 24 19:50:34 2011	(r219971)
+++ head/bin/ps/print.c	Thu Mar 24 20:15:42 2011	(r219972)
@@ -570,11 +570,20 @@ printtime(KINFO *k, VARENT *ve, long sec
 		secs += psecs / 100;
 		psecs = psecs % 100;
 	}
-	(void)snprintf(obuff, sizeof(obuff), "%3ld:%02ld%c%02ld",
+	(void)snprintf(obuff, sizeof(obuff), "%ld:%02ld%c%02ld",
 	    secs / 60, secs % 60, decimal_point, psecs);
 	(void)printf("%*s", v->width, obuff);
 }
 
+static int
+sizetime(long secs)
+{
+
+	if (secs < 60)
+		return (7);
+	return (log10(secs / 60) + 7);
+}
+
 void
 cputime(KINFO *k, VARENT *ve)
 {
@@ -930,6 +939,17 @@ s_comm(KINFO *k)
 }
 
 int
+s_cputime(KINFO *k)
+{
+	long secs;
+
+	secs = k->ki_p->ki_runtime / 1000000;
+	if (sumrusage)
+		secs += k->ki_p->ki_childtime.tv_sec;
+	return (sizetime(secs));
+}
+
+int
 s_label(KINFO *k)
 {
 	char *string = NULL;
@@ -975,3 +995,25 @@ s_logname(KINFO *k)
 
 	return (strlen(s));
 }
+
+int
+s_systime(KINFO *k)
+{
+	long secs;
+
+	secs = k->ki_p->ki_rusage.ru_stime.tv_sec;
+	if (sumrusage)
+		secs += k->ki_p->ki_childstime.tv_sec;
+	return (sizetime(secs));
+}
+
+int
+s_usertime(KINFO *k)
+{
+	long secs;
+
+	secs = k->ki_p->ki_rusage.ru_utime.tv_sec;
+	if (sumrusage)
+		secs += k->ki_p->ki_childutime.tv_sec;
+	return (sizetime(secs));
+}



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