--- machine.c.orig	Tue May  4 15:43:05 2004
+++ machine.c	Tue May  4 16:18:47 2004
@@ -77,6 +77,7 @@
 #define PP(pp, field) ((pp)->kp_proc . field)
 #define EP(pp, field) ((pp)->kp_eproc . field)
 #define VP(pp, field) ((pp)->kp_eproc.e_vm . field)
+#define RU(pp, field) ((pp)->kp_eproc.e_stats.p_ru . field)
 
 /* define what weighted cpu is.  */
 #define weighted_cpu(pct, pp) (PP((pp), p_swtime) == 0 ? 0.0 : \
@@ -111,16 +112,16 @@
  */
 
 static char smp_header[] =
-  "  PID %-*.*s PRI NICE  SIZE    RES STATE  C   TIME   WCPU    CPU COMMAND";
+  "  PID %-*.*s PR NC SIZE    RES STATE  C   TIME   WCPU    CPU    IO  COMMAND";
 
 #define smp_Proc_format \
-	"%5d %-*.*s %3d %3d%7s %6s %-6.6s %1x%7s %5.2f%% %5.2f%% %.*s"
+	"%5d %-*.*s %2d %2d %7s %6s %-6.6s %1x%7s %5.2f%% %5.2f%% %6d %.*s"
 
 static char up_header[] =
-  "  PID %-*.*s PRI NICE  SIZE    RES STATE    TIME   WCPU    CPU COMMAND";
+  "  PID %-*.*s PRI NICE  SIZE    RES STATE    TIME   WCPU    CPU    IO  COMMAND";
 
 #define up_Proc_format \
-	"%5d %-*.*s %3d %3d%7s %6s %-6.6s%.0d%7s %5.2f%% %5.2f%% %.*s"
+	"%5d %-*.*s %3d %3d%7s %6s %-6.6s%.0d%7s %5.2f%% %5.2f%% %6d %.*s"
 
 
 
@@ -214,7 +215,7 @@
 #ifdef ORDER
 /* sorting orders. first is default */
 char *ordernames[] = {
-    "cpu", "size", "res", "time", "pri", NULL
+    "cpu", "size", "res", "time", "pri", "io", NULL
 };
 #endif
 
@@ -630,6 +631,7 @@
 	    format_time(cputime),
 	    100.0 * weighted_cpu(pct, pp),
 	    100.0 * pct,
+	    RU(pp, ru_inblock) + RU(pp,ru_oublock),
 	    cmdlength,
 	    printable(PP(pp, p_comm)));
 
@@ -754,6 +756,10 @@
 #define ORDERKEY_MEM \
   if ( (result = PROCSIZE(p2) - PROCSIZE(p1)) == 0 )
 
+#define ORDERKEY_IO \
+  if ((result = (RU(p2, ru_inblock) + RU(p2, ru_oublock)) - \
+                (RU(p1, ru_inblock) + RU(p1, ru_oublock))) == 0)
+
 /* compare_cpu - the comparison function for sorting by cpu percentage */
 
 int
@@ -778,6 +784,7 @@
 
     ORDERKEY_PCTCPU
     ORDERKEY_CPTICKS
+    ORDERKEY_IO
     ORDERKEY_STATE
     ORDERKEY_PRIO
     ORDERKEY_RSSIZE
@@ -789,7 +796,7 @@
 
 #ifdef ORDER
 /* compare routines */
-int compare_size(), compare_res(), compare_time(), compare_prio();
+int compare_size(), compare_res(), compare_time(), compare_prio(), compare_io();
 
 int (*proc_compares[])() = {
     compare_cpu,
@@ -797,6 +804,7 @@
     compare_res,
     compare_time,
     compare_prio,
+    compare_io,
     NULL
 };
 
@@ -822,6 +830,7 @@
     ORDERKEY_RSSIZE
     ORDERKEY_PCTCPU
     ORDERKEY_CPTICKS
+    ORDERKEY_IO
     ORDERKEY_STATE
     ORDERKEY_PRIO
     ;
@@ -851,6 +860,7 @@
     ORDERKEY_MEM
     ORDERKEY_PCTCPU
     ORDERKEY_CPTICKS
+    ORDERKEY_IO
     ORDERKEY_STATE
     ORDERKEY_PRIO
     ;
@@ -878,6 +888,7 @@
 
     ORDERKEY_CPTICKS
     ORDERKEY_PCTCPU
+    ORDERKEY_IO
     ORDERKEY_STATE
     ORDERKEY_PRIO
     ORDERKEY_RSSIZE
@@ -908,7 +919,38 @@
     ORDERKEY_PRIO
     ORDERKEY_CPTICKS
     ORDERKEY_PCTCPU
+    ORDERKEY_IO
+    ORDERKEY_STATE
+    ORDERKEY_RSSIZE
+    ORDERKEY_MEM
+    ;
+
+    return(result);
+}
+
+/* compare_io - the comparison function for sorting by io activity */
+
+int
+compare_io(pp1, pp2)
+
+struct proc **pp1;
+struct proc **pp2;
+
+{
+    register struct kinfo_proc *p1;
+    register struct kinfo_proc *p2;
+    register int result;
+    register pctcpu lresult;
+
+    /* remove one level of indirection */
+    p1 = *(struct kinfo_proc **) pp1;
+    p2 = *(struct kinfo_proc **) pp2;
+
+    ORDERKEY_IO
     ORDERKEY_STATE
+    ORDERKEY_CPTICKS
+    ORDERKEY_PCTCPU
+    ORDERKEY_PRIO
     ORDERKEY_RSSIZE
     ORDERKEY_MEM
     ;
