I find it very useful to sort by command as it usually means less bouncing 
around.  While we're here, add sort by pid too.

Also, allow string_index to shortcut on partial matches (techinically 
unrelated).

Index: machine.c
===================================================================
RCS file: /home/tedu/cvs/src/usr.bin/top/machine.c,v
retrieving revision 1.64
diff -u -r1.64 machine.c
--- machine.c   28 Apr 2009 21:24:41 -0000      1.64
+++ machine.c   23 Jan 2010 05:06:22 -0000
@@ -118,7 +118,7 @@
 
 /* these are names given to allowed sorting orders -- first is default */
 char   *ordernames[] = {
-       "cpu", "size", "res", "time", "pri", NULL
+       "cpu", "size", "res", "time", "pri", "pid", "command", NULL
 };
 
 /* these are for keeping track of the proc array */
@@ -539,6 +539,10 @@
        if ((result = p2->p_vm_rssize - p1->p_vm_rssize) == 0)
 #define ORDERKEY_MEM \
        if ((result = PROCSIZE(p2) - PROCSIZE(p1)) == 0)
+#define ORDERKEY_PID \
+       if ((result = p1->p_pid - p2->p_pid) == 0)
+#define ORDERKEY_CMD \
+       if ((result = strcmp(p1->p_comm, p2->p_comm)) == 0)
 
 /* compare_cpu - the comparison function for sorting by cpu percentage */
 static int
@@ -660,12 +664,63 @@
        return (result);
 }
 
+static int
+compare_pid(const void *v1, const void *v2)
+{
+       struct proc **pp1 = (struct proc **) v1;
+       struct proc **pp2 = (struct proc **) v2;
+       struct kinfo_proc2 *p1, *p2;
+       pctcpu lresult;
+       int result;
+
+       /* remove one level of indirection */
+       p1 = *(struct kinfo_proc2 **) pp1;
+       p2 = *(struct kinfo_proc2 **) pp2;
+
+       ORDERKEY_PID
+       ORDERKEY_PCTCPU
+       ORDERKEY_CPUTIME
+       ORDERKEY_STATE
+       ORDERKEY_PRIO
+       ORDERKEY_RSSIZE
+       ORDERKEY_MEM
+               ;
+       return (result);
+}
+
+static int
+compare_cmd(const void *v1, const void *v2)
+{
+       struct proc **pp1 = (struct proc **) v1;
+       struct proc **pp2 = (struct proc **) v2;
+       struct kinfo_proc2 *p1, *p2;
+       pctcpu lresult;
+       int result;
+
+       /* remove one level of indirection */
+       p1 = *(struct kinfo_proc2 **) pp1;
+       p2 = *(struct kinfo_proc2 **) pp2;
+
+       ORDERKEY_CMD
+       ORDERKEY_PCTCPU
+       ORDERKEY_CPUTIME
+       ORDERKEY_STATE
+       ORDERKEY_PRIO
+       ORDERKEY_RSSIZE
+       ORDERKEY_MEM
+               ;
+       return (result);
+}
+
+
 int (*proc_compares[])(const void *, const void *) = {
        compare_cpu,
        compare_size,
        compare_res,
        compare_time,
        compare_prio,
+       compare_pid,
+       compare_cmd,
        NULL
 };
 
Index: top.1
===================================================================
RCS file: /home/tedu/cvs/src/usr.bin/top/top.1,v
retrieving revision 1.53
diff -u -r1.53 top.1
--- top.1       22 Dec 2009 18:14:23 -0000      1.53
+++ top.1       23 Jan 2010 05:07:09 -0000
@@ -144,8 +144,10 @@
 .Ar size ,
 .Ar res ,
 .Ar time ,
+.Ar pri ,
+.Ar pid ,
 and
-.Ar pri .
+.Ar command .
 .It Fl p Ar pid
 Show only the process
 .Ar pid .
Index: top.c
===================================================================
RCS file: /home/tedu/cvs/src/usr.bin/top/top.c,v
retrieving revision 1.68
diff -u -r1.68 top.c
--- top.c       10 Dec 2009 13:16:02 -0000      1.68
+++ top.c       23 Jan 2010 04:58:48 -0000
@@ -322,7 +322,7 @@
        if (order_name != NULL) {
                if ((order_index = string_index(order_name,
                    statics.order_names)) == -1) {
-                       char **pp, msg[80];
+                       char **pp, msg[512];
 
                        snprintf(msg, sizeof(msg),
                            "'%s' is not a recognized sorting order",
Index: utils.c
===================================================================
RCS file: /home/tedu/cvs/src/usr.bin/top/utils.c,v
retrieving revision 1.21
diff -u -r1.21 utils.c
--- utils.c     1 Oct 2007 09:15:44 -0000       1.21
+++ utils.c     23 Jan 2010 05:08:47 -0000
@@ -125,7 +125,7 @@
        int i = 0;
 
        while (*array != NULL) {
-               if (strcmp(string, *array) == 0)
+               if (strncmp(string, *array, strlen(string)) == 0)
                        return (i);
                array++;
                i++;

Reply via email to