aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/top/machine.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/top/machine.c')
-rw-r--r--usr.bin/top/machine.c155
1 files changed, 124 insertions, 31 deletions
diff --git a/usr.bin/top/machine.c b/usr.bin/top/machine.c
index 8c035b5df383..1f70ee9281e8 100644
--- a/usr.bin/top/machine.c
+++ b/usr.bin/top/machine.c
@@ -190,15 +190,6 @@ static int pageshift; /* log base 2 of the pagesize */
#define ki_swap(kip) \
((kip)->ki_swrss > (kip)->ki_rssize ? (kip)->ki_swrss - (kip)->ki_rssize : 0)
-/*
- * Sorting orders. The first element is the default.
- */
-static const char *ordernames[] = {
- "cpu", "size", "res", "time", "pri", "threads",
- "total", "read", "write", "fault", "vcsw", "ivcsw",
- "jid", "swap", "pid", NULL
-};
-
/* Per-cpu time states */
static int maxcpu;
static int maxid;
@@ -214,6 +205,18 @@ static int *pcpu_cpu_states;
static int battery_units;
static int battery_life;
+static int compare_cpu(const void *a, const void *b);
+static int compare_size(const void *a, const void *b);
+static int compare_res(const void *a, const void *b);
+static int compare_time(const void *a, const void *b);
+static int compare_prio(const void *a, const void *b);
+static int compare_threads(const void *a, const void *b);
+static int compare_iototal(const void *a, const void *b);
+static int compare_ioread(const void *a, const void *b);
+static int compare_iowrite(const void *a, const void *b);
+static int compare_iofault(const void *a, const void *b);
+static int compare_vcsw(const void *a, const void *b);
+static int compare_ivcsw(const void *a, const void *b);
static int compare_swap(const void *a, const void *b);
static int compare_jid(const void *a, const void *b);
static int compare_pid(const void *a, const void *b);
@@ -225,6 +228,77 @@ static void update_layout(void);
static int find_uid(uid_t needle, int *haystack);
static int cmd_matches(struct kinfo_proc *, const char *);
+/*
+ * Sorting orders. The first element is the default.
+ */
+
+typedef int (compare_fn)(const void *arg1, const void *arg2);
+static const struct sort_info {
+ const char *si_name;
+ compare_fn *si_compare;
+} sortdata[] = {
+ {
+ .si_name = "cpu",
+ .si_compare = &compare_cpu,
+ },
+ {
+ .si_name = "size",
+ .si_compare = &compare_size,
+ },
+ {
+ .si_name = "res",
+ .si_compare = &compare_res,
+ },
+ {
+ .si_name = "time",
+ .si_compare = &compare_time,
+ },
+ {
+ .si_name = "pri",
+ .si_compare = &compare_prio,
+ },
+ {
+ .si_name = "threads",
+ .si_compare = &compare_threads,
+ },
+ {
+ .si_name = "total",
+ .si_compare = &compare_iototal,
+ },
+ {
+ .si_name = "read",
+ .si_compare = &compare_ioread,
+ },
+ {
+ .si_name = "write",
+ .si_compare = &compare_iowrite,
+ },
+ {
+ .si_name = "fault",
+ .si_compare = &compare_iofault,
+ },
+ {
+ .si_name = "vcsw",
+ .si_compare = &compare_vcsw,
+ },
+ {
+ .si_name = "ivcsw",
+ .si_compare = &compare_ivcsw,
+ },
+ {
+ .si_name = "jid",
+ .si_compare = &compare_jid,
+ },
+ {
+ .si_name = "swap",
+ .si_compare = &compare_swap,
+ },
+ {
+ .si_name = "pid",
+ .si_compare = &compare_pid,
+ },
+};
+
static int
find_uid(uid_t needle, int *haystack)
{
@@ -353,7 +427,6 @@ machine_init(struct statics *statics)
statics->swap_names = swapnames;
else
statics->swap_names = NULL;
- statics->order_names = ordernames;
/* Allocate state for per-CPU stats. */
GETSYSCTL("kern.smp.maxcpus", maxcpu);
@@ -742,7 +815,7 @@ static struct handle handle;
void *
get_process_info(struct system_info *si, struct process_select *sel,
- int (*compare)(const void *, const void *))
+ const struct sort_info *sort_info)
{
int i;
int total_procs;
@@ -753,6 +826,9 @@ get_process_info(struct system_info *si, struct process_select *sel,
struct kinfo_proc **prefp;
struct kinfo_proc *pp;
struct timespec previous_proc_uptime;
+ compare_fn *compare;
+
+ compare = sort_info->si_compare;
/*
* If thread state was toggled, don't cache the previous processes.
@@ -899,6 +975,43 @@ get_process_info(struct system_info *si, struct process_select *sel,
return (&handle);
}
+/*
+ * Returns the sort info associated with the specified order. Currently, that's
+ * really only the comparator that we'll later use. Specifying a NULL ordername
+ * will return the default comparator.
+ */
+const struct sort_info *
+get_sort_info(const char *ordername)
+{
+ const struct sort_info *info;
+ size_t idx;
+
+ if (ordername == NULL)
+ return (&sortdata[0]);
+
+ for (idx = 0; idx < nitems(sortdata); idx++) {
+ info = &sortdata[idx];
+
+ if (strcmp(info->si_name, ordername) == 0)
+ return (info);
+ }
+
+ return (NULL);
+}
+
+void
+dump_sort_names(FILE *fp)
+{
+ const struct sort_info *info;
+ size_t idx;
+
+ for (idx = 0; idx < nitems(sortdata); idx++) {
+ info = &sortdata[idx];
+
+ fprintf(fp, " %s", info->si_name);
+ }
+}
+
static int
cmd_matches(struct kinfo_proc *proc, const char *term)
{
@@ -1559,26 +1672,6 @@ compare_ivcsw(const void *arg1, const void *arg2)
return (flp2 - flp1);
}
-int (*compares[])(const void *arg1, const void *arg2) = {
- compare_cpu,
- compare_size,
- compare_res,
- compare_time,
- compare_prio,
- compare_threads,
- compare_iototal,
- compare_ioread,
- compare_iowrite,
- compare_iofault,
- compare_vcsw,
- compare_ivcsw,
- compare_jid,
- compare_swap,
- compare_pid,
- NULL
-};
-
-
static int
swapmode(int *retavail, int *retfree)
{