Author: kib
Date: Thu Mar 17 11:25:32 2011
New Revision: 219713
URL: http://svn.freebsd.org/changeset/base/219713

Log:
  Implement the usertime and systime keywords for ps, printing the
  corresponding times reported by getrusage().
  
  Submitted by: Dan Nelson <dnelson allantgroup com>
  MFC after:    1 week

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

Modified: head/bin/ps/extern.h
==============================================================================
--- head/bin/ps/extern.h        Thu Mar 17 11:23:12 2011        (r219712)
+++ head/bin/ps/extern.h        Thu Mar 17 11:25:32 2011        (r219713)
@@ -81,12 +81,14 @@ int  s_uname(KINFO *);
 void    showkey(void);
 void    started(KINFO *, VARENT *);
 void    state(KINFO *, VARENT *);
+void    systime(KINFO *, VARENT *);
 void    tdev(KINFO *, VARENT *);
 void    tdnam(KINFO *, VARENT *);
 void    tname(KINFO *, VARENT *);
 void    ucomm(KINFO *, VARENT *);
 void    uname(KINFO *, VARENT *);
 void    upr(KINFO *, VARENT *);
+void    usertime(KINFO *, VARENT *);
 void    vsize(KINFO *, VARENT *);
 void    wchan(KINFO *, VARENT *);
 __END_DECLS

Modified: head/bin/ps/keyword.c
==============================================================================
--- head/bin/ps/keyword.c       Thu Mar 17 11:23:12 2011        (r219712)
+++ head/bin/ps/keyword.c       Thu Mar 17 11:25:32 2011        (r219713)
@@ -189,6 +189,7 @@ 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},
        {"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},
@@ -210,6 +211,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},
        {"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 17 11:23:12 2011        (r219712)
+++ head/bin/ps/print.c Thu Mar 17 11:25:32 2011        (r219713)
@@ -550,12 +550,11 @@ vsize(KINFO *k, VARENT *ve)
        (void)printf("%*lu", v->width, (u_long)(k->ki_p->ki_size / 1024));
 }
 
-void
-cputime(KINFO *k, VARENT *ve)
+static void
+printtime(KINFO *k, VARENT *ve, long secs, long psecs)
+/* psecs is "parts" of a second. first micro, then centi */
 {
        VAR *v;
-       long secs;
-       long psecs;     /* "parts" of a second. first micro, then centi */
        char obuff[128];
        static char decimal_point;
 
@@ -566,20 +565,7 @@ cputime(KINFO *k, VARENT *ve)
                secs = 0;
                psecs = 0;
        } else {
-               /*
-                * This counts time spent handling interrupts.  We could
-                * fix this, but it is not 100% trivial (and interrupt
-                * time fractions only work on the sparc anyway).       XXX
-                */
-               secs = k->ki_p->ki_runtime / 1000000;
-               psecs = k->ki_p->ki_runtime % 1000000;
-               if (sumrusage) {
-                       secs += k->ki_p->ki_childtime.tv_sec;
-                       psecs += k->ki_p->ki_childtime.tv_usec;
-               }
-               /*
-                * round and scale to 100's
-                */
+               /* round and scale to 100's */
                psecs = (psecs + 5000) / 10000;
                secs += psecs / 100;
                psecs = psecs % 100;
@@ -590,6 +576,53 @@ cputime(KINFO *k, VARENT *ve)
 }
 
 void
+cputime(KINFO *k, VARENT *ve)
+{
+       long secs, psecs;
+
+       /*
+        * This counts time spent handling interrupts.  We could
+        * fix this, but it is not 100% trivial (and interrupt
+        * time fractions only work on the sparc anyway).       XXX
+        */
+       secs = k->ki_p->ki_runtime / 1000000;
+       psecs = k->ki_p->ki_runtime % 1000000;
+       if (sumrusage) {
+               secs += k->ki_p->ki_childtime.tv_sec;
+               psecs += k->ki_p->ki_childtime.tv_usec;
+       }
+       printtime(k, ve, secs, psecs);
+}
+
+void
+systime(KINFO *k, VARENT *ve)
+{
+       long secs, psecs;
+
+       secs = k->ki_p->ki_rusage.ru_stime.tv_sec;
+       psecs = k->ki_p->ki_rusage.ru_stime.tv_usec;
+       if (sumrusage) {
+               secs += k->ki_p->ki_childstime.tv_sec;
+               psecs += k->ki_p->ki_childstime.tv_usec;
+       }
+       printtime(k, ve, secs, psecs);
+}
+
+void
+usertime(KINFO *k, VARENT *ve)
+{
+       long secs, psecs;
+
+       secs = k->ki_p->ki_rusage.ru_utime.tv_sec;
+       psecs = k->ki_p->ki_rusage.ru_utime.tv_usec;
+       if (sumrusage) {
+               secs += k->ki_p->ki_childutime.tv_sec;
+               psecs += k->ki_p->ki_childutime.tv_usec;
+       }
+       printtime(k, ve, secs, psecs);
+}
+
+void
 elapsed(KINFO *k, VARENT *ve)
 {
        VAR *v;

Modified: head/bin/ps/ps.1
==============================================================================
--- head/bin/ps/ps.1    Thu Mar 17 11:23:12 2011        (r219712)
+++ head/bin/ps/ps.1    Thu Mar 17 11:25:32 2011        (r219713)
@@ -29,7 +29,7 @@
 .\"     @(#)ps.1       8.3 (Berkeley) 4/18/94
 .\" $FreeBSD$
 .\"
-.Dd March 5, 2011
+.Dd March 16, 2011
 .Dt PS 1
 .Os
 .Sh NAME
@@ -205,8 +205,8 @@ Display information about processes whic
 Sort by current CPU usage, instead of the combination of controlling
 terminal and process ID.
 .It Fl S
-Change the way the process time is calculated by summing all exited
-children to their parent process.
+Change the way the process times, namely cputime, systime, and usertime,
+are calculated by summing all exited children to their parent process.
 .It Fl T
 Display information about processes attached to the device associated
 with the standard input.
@@ -596,6 +596,8 @@ symbolic process state (alias
 saved gid from a setgid executable
 .It Cm svuid
 saved UID from a setuid executable
+.It Cm systime
+accumulated system CPU time
 .It Cm tdaddr
 thread address
 .It Cm tdev
@@ -626,6 +628,8 @@ scheduling priority on return from syste
 .Cm usrpri )
 .It Cm user
 user name (from UID)
+.It Cm usertime
+accumulated user CPU time
 .It Cm vsz
 virtual size in Kbytes (alias
 .Cm vsize )
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to