ps: improve TIME column for large times: showing "14453:50" is not good
authorDenys Vlasenko <vda.linux@googlemail.com>
Thu, 10 Aug 2017 13:01:43 +0000 (15:01 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Thu, 10 Aug 2017 13:02:16 +0000 (15:02 +0200)
function                                             old     new   delta
format_time                                            -     110    +110
func_time                                             59      50      -9
func_etime                                            67      53     -14
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 0/2 up/down: 110/-23)            Total: 87 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
procps/ps.c

index 2a53cc9749e5bfcb2591efb7a8a06af5790e0bb4..646b1144eec55c52df1860595a14ea94b6ee0700 100644 (file)
@@ -308,28 +308,55 @@ static void func_nice(char *buf, int size, const procps_status_t *ps)
 #endif
 
 #if ENABLE_FEATURE_PS_TIME
+static void format_time(char *buf, int size, unsigned long tt)
+{
+       unsigned ff;
+
+       /* Used to show "14453:50" if tt is large. Ugly.
+        * procps-ng 3.3.10 uses "[[dd-]hh:]mm:ss" format.
+        * TODO: switch to that?
+        */
+
+       /* Formatting for 5-char TIME column.
+        * NB: "size" is not always 5: ELAPSED is wider (7),
+        * not taking advantage of that (yet?).
+        */
+       ff = tt % 60;
+       tt /= 60;
+       if (tt < 60) {
+               snprintf(buf, size+1, "%2u:%02u", (unsigned)tt, ff);
+               return;
+       }
+       ff = tt % 60;
+       tt /= 60;
+       if (tt < 24) {
+               snprintf(buf, size+1, "%2uh%02u", (unsigned)tt, ff);
+               return;
+       }
+       ff = tt % 24;
+       tt /= 24;
+       if (tt < 100) {
+               snprintf(buf, size+1, "%2ud%02u", (unsigned)tt, ff);
+               return;
+       }
+       snprintf(buf, size+1, "%4lud", tt);
+}
 static void func_etime(char *buf, int size, const procps_status_t *ps)
 {
        /* elapsed time [[dd-]hh:]mm:ss; here only mm:ss */
        unsigned long mm;
-       unsigned ss;
 
        mm = ps->start_time / get_kernel_HZ();
        mm = G.seconds_since_boot - mm;
-       ss = mm % 60;
-       mm /= 60;
-       snprintf(buf, size+1, "%3lu:%02u", mm, ss);
+       format_time(buf, size, mm);
 }
 static void func_time(char *buf, int size, const procps_status_t *ps)
 {
        /* cumulative time [[dd-]hh:]mm:ss; here only mm:ss */
        unsigned long mm;
-       unsigned ss;
 
        mm = (ps->utime + ps->stime) / get_kernel_HZ();
-       ss = mm % 60;
-       mm /= 60;
-       snprintf(buf, size+1, "%3lu:%02u", mm, ss);
+       format_time(buf, size, mm);
 }
 #endif
 
@@ -365,7 +392,7 @@ static const ps_out_t out_spec[] = {
 //     { 5                  , "pcpu"  ,"%CPU"   ,func_pcpu  ,PSSCAN_        },
 #endif
 #if ENABLE_FEATURE_PS_TIME
-       { 6                  , "time"  ,"TIME"   ,func_time  ,PSSCAN_STIME | PSSCAN_UTIME },
+       { 5                  , "time"  ,"TIME"   ,func_time  ,PSSCAN_STIME | PSSCAN_UTIME },
 #endif
        { 6                  , "tty"   ,"TT"     ,func_tty   ,PSSCAN_TTY     },
        { 4                  , "vsz"   ,"VSZ"    ,func_vsz   ,PSSCAN_VSZ     },