summaryrefslogtreecommitdiffstats
path: root/usr.bin/top
diff options
context:
space:
mode:
authorkeramida <keramida@FreeBSD.org>2004-07-08 16:45:55 +0000
committerkeramida <keramida@FreeBSD.org>2004-07-08 16:45:55 +0000
commit600bdc3b5526e0f026e54672896d7ad955b9c8b4 (patch)
tree153fa5f6acfe18876ad4e529cbaf3e596408c2e2 /usr.bin/top
parent72f812830f217b50cb5b7e851b69e500996804e5 (diff)
downloadFreeBSD-src-600bdc3b5526e0f026e54672896d7ad955b9c8b4.zip
FreeBSD-src-600bdc3b5526e0f026e54672896d7ad955b9c8b4.tar.gz
Build upon the nice work of Alfred and add sorting capabilities to
the -m "io" mode of top. Approved by: alfred
Diffstat (limited to 'usr.bin/top')
-rw-r--r--usr.bin/top/machine.c80
1 files changed, 77 insertions, 3 deletions
diff --git a/usr.bin/top/machine.c b/usr.bin/top/machine.c
index 063fa38..7db6fa8 100644
--- a/usr.bin/top/machine.c
+++ b/usr.bin/top/machine.c
@@ -205,10 +205,16 @@ static int pageshift; /* log base 2 of the pagesize */
long percentages();
#ifdef ORDER
-/* sorting orders. first is default */
-char *ordernames[] = {
+/*
+ * Sorting orders. One vector per display mode.
+ * The first element is the default for each mode.
+ */
+char *proc_ordernames[] = {
"cpu", "size", "res", "time", "pri", NULL
};
+char *io_ordernames[] = {
+ "total", "read", "write", "fault", NULL
+};
#endif
int
@@ -265,7 +271,15 @@ machine_init(struct statics *statics)
statics->memory_names = memorynames;
statics->swap_names = swapnames;
#ifdef ORDER
- statics->order_names = ordernames;
+ switch (displaymode) {
+ case DISP_IO:
+ statics->order_names = io_ordernames;
+ break;
+ case DISP_CPU:
+ default:
+ statics->order_names = proc_ordernames;
+ break;
+ }
#endif
/* all done! */
@@ -917,14 +931,74 @@ compare_prio(void *arg1, void *arg2)
}
#endif
+/* compare_io - the comparison function for sorting by total io */
+
int
+#ifdef ORDER
+compare_iototal(void *arg1, void *arg2)
+#else
io_compare(void *arg1, void *arg2)
+#endif
{
struct kinfo_proc *p1 = *(struct kinfo_proc **)arg1;
struct kinfo_proc *p2 = *(struct kinfo_proc **)arg2;
return (get_io_total(p2) - get_io_total(p1));
}
+
+#ifdef ORDER
+/* io compare routines */
+int compare_ioread(), compare_iowrite(), compare_iofault();
+
+int (*io_compares[])() = {
+ compare_iototal,
+ compare_ioread,
+ compare_iowrite,
+ compare_iofault,
+ NULL
+};
+
+int
+compare_ioread(void *arg1, void *arg2)
+{
+ struct kinfo_proc *p1 = *(struct kinfo_proc **)arg1;
+ struct kinfo_proc *p2 = *(struct kinfo_proc **)arg2;
+ long dummy, inp1, inp2;
+
+ (void) get_io_stats(p1, &inp1, &dummy, &dummy);
+ (void) get_io_stats(p2, &inp2, &dummy, &dummy);
+
+ return (inp2 - inp1);
+}
+
+int
+compare_iowrite(void *arg1, void *arg2)
+{
+ struct kinfo_proc *p1 = *(struct kinfo_proc **)arg1;
+ struct kinfo_proc *p2 = *(struct kinfo_proc **)arg2;
+ long dummy, oup1, oup2;
+
+ (void) get_io_stats(p1, &dummy, &oup1, &dummy);
+ (void) get_io_stats(p2, &dummy, &oup2, &dummy);
+
+ return (oup2 - oup1);
+}
+
+int
+compare_iofault(void *arg1, void *arg2)
+{
+ struct kinfo_proc *p1 = *(struct kinfo_proc **)arg1;
+ struct kinfo_proc *p2 = *(struct kinfo_proc **)arg2;
+ long dummy, flp1, flp2;
+
+ (void) get_io_stats(p1, &dummy, &dummy, &flp1);
+ (void) get_io_stats(p2, &dummy, &dummy, &flp2);
+
+ return (flp2 - flp1);
+}
+
+#endif /* ORDER */
+
/*
* proc_owner(pid) - returns the uid that owns process "pid", or -1 if
* the process does not exist.
OpenPOWER on IntegriCloud