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++;