pkgsrc/sysutils/top/patches/patch-af
agc d9a9305b62 Split patch-aa into multiple files.
Make the patch to util.c apply without fuzz.
1999-12-08 16:18:48 +00:00

570 lines
13 KiB
Text

$NetBSD: patch-af,v 1.1 1999/12/08 16:18:49 agc Exp $
--- machine/m_netbsd10.c Fri Jan 26 06:27:18 1996
+++ machine/m_netbsd10.c Sat Oct 4 03:27:03 1997
@@ -3,3 +3,3 @@
*
- * SYNOPSIS: For a NetBSD-1.0 (4.4BSD) system
+ * SYNOPSIS: For a NetBSD-1.0 through NetBSD-1.2.1 system
* Note process resident sizes could be wrong, but ps shows
@@ -9,5 +9,5 @@
* Originally written for BSD4.4 system by Christos Zoulas.
- * Based on the FreeBSD 2.0 version by Steven Wallace && Wolfram Schneider
- * NetBSD-1.0 port by Arne Helme
- * .
+ * Based on the FreeBSD 2.0 version by Steven Wallace && Wolfram Schneider.
+ * NetBSD-1.0 port by Arne Helme. Process ordering added by Luke Mewburn.
+ *
* This is the machine-dependent module for NetBSD-1.0
@@ -15,2 +15,5 @@
* NetBSD-1.0
+ * NetBSD-1.1
+ * NetBSD-1.2
+ * NetBSD-1.2.1
*
@@ -18,3 +21,3 @@
*
- * CFLAGS: -DHAVE_GETOPT
+ * CFLAGS: -DHAVE_GETOPT -DORDER
*
@@ -24,2 +27,4 @@
* Arne Helme <arne@acm.org>
+ * Luke Mewburn <lukem@netbsd.org>
+ *
*
@@ -30,4 +35,4 @@
-#define LASTPID /**/ /* use last pid, compiler depended */
-/* #define LASTPID_FIXED /**/
+/* #define LASTPID */ /* use last pid, compiler depended */
+/* #define LASTPID_FIXED */
#define VM_REAL /**/ /* use the same values as vmstat -s */
@@ -53,2 +58,11 @@
+#include "os.h"
+
+#include <err.h>
+#include <kvm.h>
+#include <math.h>
+#include <nlist.h>
+#include <stdio.h>
+#include <unistd.h>
+
#ifdef USE_SWAP
@@ -87,3 +101,4 @@
/* what we consider to be process size: */
-#define PROCSIZE(pp) (VP((pp), vm_tsize) + VP((pp), vm_dsize) + VP((pp), vm_ssize))
+#define PROCSIZE(pp) \
+ (VP((pp), vm_tsize) + VP((pp), vm_dsize) + VP((pp), vm_ssize))
@@ -171,3 +186,3 @@
{
- "", "start", "run\0\0\0", "sleep", "stop", "zomb", "WAIT"
+ "", "start", "run\0\0\0", "sleep", "stop", "zomb"
};
@@ -196,3 +211,2 @@
static unsigned long cnt_offset;
-static long cnt;
#endif
@@ -239,2 +253,33 @@
+
+/* these are names given to allowed sorting orders -- first is default */
+char *ordernames[] = {
+ "cpu",
+ "pri",
+ "res",
+ "size",
+ "state",
+ "time",
+ NULL
+};
+
+/* forward definitions for comparison functions */
+int compare_cpu();
+int compare_prio();
+int compare_res();
+int compare_size();
+int compare_state();
+int compare_time();
+
+int (*proc_compares[])() = {
+ compare_cpu,
+ compare_prio,
+ compare_res,
+ compare_size,
+ compare_state,
+ compare_time,
+ NULL
+};
+
+
/* these are for keeping track of the proc array */
@@ -260,8 +305,6 @@
machine_init(statics)
-
-struct statics *statics;
-
+ struct statics *statics;
{
- register int i = 0;
- register int pagesize;
+ int i = 0;
+ int pagesize;
@@ -293,6 +336,2 @@
-#if (defined DEBUG)
- fprintf(stderr, "Hertz: %d\n", hz);
-#endif
-
(void) getkval(nlst[X_CCPU].n_value, (int *)(&ccpu), sizeof(ccpu),
@@ -333,2 +372,3 @@
statics->memory_names = memorynames;
+ statics->order_names = ordernames;
@@ -338,8 +378,7 @@
-char *format_header(uname_field)
-
-register char *uname_field;
-
+char *
+format_header(uname_field)
+ char *uname_field;
{
- register char *ptr;
+ char *ptr;
@@ -360,8 +399,5 @@
get_system_info(si)
-
-struct system_info *si;
-
+ struct system_info *si;
{
long total;
- load_avg avenrun[3];
@@ -370,31 +406,13 @@
nlst[X_CP_TIME].n_name);
- (void) getkval(avenrun_offset, (int *)avenrun, sizeof(avenrun),
- nlst[X_AVENRUN].n_name);
#ifdef LASTPID
- (void) getkval(lastpid_offset, (int *)(&lastpid), sizeof(lastpid),
- "!");
+ (void) getkval(lastpid_offset, (int *)(&lastpid), sizeof(lastpid), "!");
#endif
- /* convert load averages to doubles */
- {
- register int i;
- register double *infoloadp;
- load_avg *avenrunp;
+ if (getloadavg(si->load_avg, NUM_AVERAGES) < 0) {
+ int i;
-#ifdef notyet
- struct loadavg sysload;
- int size;
- getkerninfo(KINFO_LOADAVG, &sysload, &size, 0);
-#endif
-
- infoloadp = si->load_avg;
- avenrunp = avenrun;
- for (i = 0; i < 3; i++)
- {
-#ifdef notyet
- *infoloadp++ = ((double) sysload.ldavg[i]) / sysload.fscale;
-#endif
- *infoloadp++ = loaddouble(*avenrunp++);
- }
+ warn("can't getloadavg");
+ for (i = 0; i < NUM_AVERAGES; i++)
+ si->load_avg[i] = 0.0;
}
@@ -426,4 +444,4 @@
memory_stats[7] = pagetok(total.t_free);
- }
-#else
+
+#else /* !VM_REAL */
struct vmmeter sum;
@@ -455,5 +473,5 @@
/* swap_delay++; XXX Arne */
-#else
+#else /* !USE_SWAP */
memory_stats[4] = 0;
-#endif
+#endif /* !USE_SWAP */
@@ -461,4 +479,5 @@
memory_stats[7] = -1;
+#endif /* !VM_REAL */
}
-#endif
+
/* set arrays and strings */
@@ -480,14 +498,13 @@
-caddr_t get_process_info(si, sel, compare)
-
-struct system_info *si;
-struct process_select *sel;
-int (*compare)();
-
+caddr_t
+get_process_info(si, sel, compare)
+ struct system_info *si;
+ struct process_select *sel;
+ int (*compare)();
{
- register int i;
- register int total_procs;
- register int active_procs;
- register struct kinfo_proc **prefp;
- register struct kinfo_proc *pp;
+ int i;
+ int total_procs;
+ int active_procs;
+ struct kinfo_proc **prefp;
+ struct kinfo_proc *pp;
@@ -564,11 +581,10 @@
-char *format_next_process(handle, get_userid)
-
-caddr_t handle;
-char *(*get_userid)();
-
+char *
+format_next_process(handle, get_userid)
+ caddr_t handle;
+ char *(*get_userid)();
{
- register struct kinfo_proc *pp;
- register long cputime;
- register double pct;
+ struct kinfo_proc *pp;
+ long cputime;
+ double pct;
struct handle *hp;
@@ -633,8 +649,7 @@
-static int check_nlist(nlst)
-
-register struct nlist *nlst;
-
+static int
+check_nlist(nlst)
+ struct nlist *nlst;
{
- register int i;
+ int i;
@@ -672,9 +687,8 @@
-static int getkval(offset, ptr, size, refstr)
-
-unsigned long offset;
-int *ptr;
-int size;
-char *refstr;
-
+static int
+getkval(offset, ptr, size, refstr)
+ unsigned long offset;
+ int *ptr;
+ int size;
+ char *refstr;
{
@@ -696,12 +710,13 @@
-/* comparison routine for qsort */
+/* comparison routines for qsort */
/*
- * proc_compare - comparison function for "qsort"
- * Compares the resource consumption of two processes using five
- * distinct keys. The keys (in descending order of importance) are:
- * percent cpu, cpu ticks, state, resident set size, total virtual
- * memory usage. The process states are ordered as follows (from least
- * to most important): WAIT, zombie, sleep, stop, start, run. The
- * array declaration below maps a process state index into a number
+ * There are currently four possible comparison routines. main selects
+ * one of these by indexing in to the array proc_compares.
+ *
+ * Possible keys are defined as macros below. Currently these keys are
+ * defined: percent cpu, cpu ticks, process state, resident set size,
+ * total virtual memory usage. The process states are ordered as follows
+ * (from least to most important): WAIT, zombie, sleep, stop, start, run.
+ * The array declaration below maps a process state index into a number
* that reflects this ordering.
@@ -709,24 +724,79 @@
-static unsigned char sorted_state[] =
-{
- 0, /* not used */
- 3, /* sleep */
- 1, /* ABANDONED (WAIT) */
- 6, /* run */
- 5, /* start */
- 2, /* zombie */
- 4 /* stop */
+/*
+ * First, the possible comparison keys. These are defined in such a way
+ * that they can be merely listed in the source code to define the actual
+ * desired ordering.
+ */
+
+#define ORDERKEY_PCTCPU \
+ if (lresult = PP(p2, p_pctcpu) - PP(p1, p_pctcpu),\
+ (result = lresult > 0 ? 1 : lresult < 0 ? -1 : 0) == 0)
+
+#define ORDERKEY_CPTICKS \
+ if (lresult = PP(p2, p_rtime).tv_sec - PP(p1, p_rtime).tv_sec,\
+ (result = lresult > 0 ? 1 : lresult < 0 ? -1 : 0) == 0)
+
+#define ORDERKEY_STATE \
+ if ((result = sorted_state[(int)PP(p2, p_stat)] - \
+ sorted_state[(int)PP(p1, p_stat)] ) == 0)
+
+#define ORDERKEY_PRIO \
+ if ((result = PP(p2, p_priority) - PP(p1, p_priority)) == 0)
+
+#define ORDERKEY_RSSIZE \
+ if ((result = VP(p2, vm_rssize) - VP(p1, vm_rssize)) == 0)
+
+#define ORDERKEY_MEM \
+ if ((result = (PROCSIZE(p2) - PROCSIZE(p1))) == 0)
+
+/*
+ * Now the array that maps process state to a weight.
+ * The order of the elements should match those in state_abbrev[]
+ */
+
+static int sorted_state[] = {
+ 0, /* (not used) ? */
+ 4, /* "start" SIDL */
+ 5, /* "run" SRUN */
+ 2, /* "sleep" SSLEEP */
+ 3, /* "stop" SSTOP */
+ 1, /* "zomb" SZOMB */
};
+/* compare_cpu - the comparison function for sorting by cpu percentage */
+
int
-proc_compare(pp1, pp2)
+compare_cpu(pp1, pp2)
+ struct proc **pp1, **pp2;
+{
+ struct kinfo_proc *p1;
+ struct kinfo_proc *p2;
+ int result;
+ pctcpu lresult;
+
+ /* remove one level of indirection */
+ p1 = *(struct kinfo_proc **) pp1;
+ p2 = *(struct kinfo_proc **) pp2;
-struct proc **pp1;
-struct proc **pp2;
+ ORDERKEY_PCTCPU
+ ORDERKEY_CPTICKS
+ ORDERKEY_STATE
+ ORDERKEY_PRIO
+ ORDERKEY_RSSIZE
+ ORDERKEY_MEM
+ ;
+ return (result);
+}
+
+/* compare_prio - the comparison function for sorting by process priority */
+
+int
+compare_prio(pp1, pp2)
+ struct proc **pp1, **pp2;
{
- register struct kinfo_proc *p1;
- register struct kinfo_proc *p2;
- register int result;
- register pctcpu lresult;
+ struct kinfo_proc *p1;
+ struct kinfo_proc *p2;
+ int result;
+ pctcpu lresult;
@@ -736,31 +806,115 @@
- /* compare percent cpu (pctcpu) */
- if ((lresult = PP(p2, p_pctcpu) - PP(p1, p_pctcpu)) == 0)
- {
- /* use cpticks to break the tie */
- if ((result = PP(p2, p_cpticks) - PP(p1, p_cpticks)) == 0)
- {
- /* use process state to break the tie */
- if ((result = sorted_state[(unsigned char) PP(p2, p_stat)] -
- sorted_state[(unsigned char) PP(p1, p_stat)]) == 0)
- {
- /* use priority to break the tie */
- if ((result = PP(p2, p_priority) - PP(p1, p_priority)) == 0)
- {
- /* use resident set size (rssize) to break the tie */
- if ((result = VP(p2, vm_rssize) - VP(p1, vm_rssize)) == 0)
- {
- /* use total memory to break the tie */
- result = PROCSIZE(p2) - PROCSIZE(p1);
- }
- }
- }
- }
- }
- else
- {
- result = lresult < 0 ? -1 : 1;
- }
+ ORDERKEY_PRIO
+ ORDERKEY_PCTCPU
+ ORDERKEY_CPTICKS
+ ORDERKEY_STATE
+ ORDERKEY_RSSIZE
+ ORDERKEY_MEM
+ ;
- return(result);
+ return (result);
+}
+
+/* compare_res - the comparison function for sorting by resident set size */
+
+int
+compare_res(pp1, pp2)
+ struct proc **pp1, **pp2;
+{
+ struct kinfo_proc *p1;
+ struct kinfo_proc *p2;
+ int result;
+ pctcpu lresult;
+
+ /* remove one level of indirection */
+ p1 = *(struct kinfo_proc **) pp1;
+ p2 = *(struct kinfo_proc **) pp2;
+
+ ORDERKEY_RSSIZE
+ ORDERKEY_MEM
+ ORDERKEY_PCTCPU
+ ORDERKEY_CPTICKS
+ ORDERKEY_STATE
+ ORDERKEY_PRIO
+ ;
+
+ return (result);
+}
+
+/* compare_size - the comparison function for sorting by total memory usage */
+
+int
+compare_size(pp1, pp2)
+ struct proc **pp1, **pp2;
+{
+ struct kinfo_proc *p1;
+ struct kinfo_proc *p2;
+ int result;
+ pctcpu lresult;
+
+ /* remove one level of indirection */
+ p1 = *(struct kinfo_proc **) pp1;
+ p2 = *(struct kinfo_proc **) pp2;
+
+ ORDERKEY_MEM
+ ORDERKEY_RSSIZE
+ ORDERKEY_PCTCPU
+ ORDERKEY_CPTICKS
+ ORDERKEY_STATE
+ ORDERKEY_PRIO
+ ;
+
+ return (result);
+}
+
+/* compare_state - the comparison function for sorting by process state */
+
+int
+compare_state(pp1, pp2)
+ struct proc **pp1, **pp2;
+{
+ struct kinfo_proc *p1;
+ struct kinfo_proc *p2;
+ int result;
+ pctcpu lresult;
+
+ /* remove one level of indirection */
+ p1 = *(struct kinfo_proc **) pp1;
+ p2 = *(struct kinfo_proc **) pp2;
+
+ ORDERKEY_STATE
+ ORDERKEY_PCTCPU
+ ORDERKEY_CPTICKS
+ ORDERKEY_PRIO
+ ORDERKEY_RSSIZE
+ ORDERKEY_MEM
+ ;
+
+ return (result);
+}
+
+/* compare_time - the comparison function for sorting by total cpu time */
+
+int
+compare_time(pp1, pp2)
+ struct proc **pp1, **pp2;
+{
+ struct kinfo_proc *p1;
+ struct kinfo_proc *p2;
+ int result;
+ pctcpu lresult;
+
+ /* remove one level of indirection */
+ p1 = *(struct kinfo_proc **) pp1;
+ p2 = *(struct kinfo_proc **) pp2;
+
+ ORDERKEY_CPTICKS
+ ORDERKEY_PCTCPU
+ ORDERKEY_STATE
+ ORDERKEY_PRIO
+ ORDERKEY_MEM
+ ORDERKEY_RSSIZE
+ ;
+
+ return (result);
}
@@ -778,10 +932,9 @@
-int proc_owner(pid)
-
-int pid;
-
+int
+proc_owner(pid)
+ int pid;
{
- register int cnt;
- register struct kinfo_proc **prefp;
- register struct kinfo_proc *pp;
+ int cnt;
+ struct kinfo_proc **prefp;
+ struct kinfo_proc *pp;
@@ -832,2 +985,3 @@
+ l = 0;
KGET(VM_NSWAP, nswap);
@@ -938,4 +1092,2 @@
-
-#endif
-
+#endif /* USE_SWAP */