diff options
author | Mark Wong <mark@2ndQuadrant.com> | 2019-06-25 17:59:21 -0700 |
---|---|---|
committer | Mark Wong <mark@2ndQuadrant.com> | 2019-07-08 19:17:01 +0000 |
commit | 0755e6eda86cfbae8b7aab23f02dd96049c978e3 (patch) | |
tree | f87831a3356d99b3a753cee7614e5b015c727f5a | |
parent | 395c7c86d75c7dbb232cb6e2e56f07b18e331d7c (diff) |
Remove SunOS4
EOL was September 30, 2003.
-rw-r--r-- | machine/m_sunos4.c | 959 | ||||
-rw-r--r-- | machine/m_sunos4.man | 23 |
2 files changed, 0 insertions, 982 deletions
diff --git a/machine/m_sunos4.c b/machine/m_sunos4.c deleted file mode 100644 index d0b82b2..0000000 --- a/machine/m_sunos4.c +++ /dev/null @@ -1,959 +0,0 @@ -/* - * pg_top - a top PostgreSQL users display for Unix - * - * SYNOPSIS: any Sun running SunOS version 4.x - * - * DESCRIPTION: - * This is the machine-dependent module for SunOS 4.x. - * This makes pg_top work on the following systems: - * SunOS 4.0 - * SunOS 4.0.1 - * SunOS 4.0.2 (including 386i architecture) - * SunOS 4.0.3 - * SunOS 4.1 - * SunOS 4.1.1 - * SunOS 4.1.2 (including MP architectures) - * SunOS 4.1.3 (including MP architectures) - * SunOS 4.1.3_U1 (including MP architectures) - * SunOS 4.1.4 (including MP architectures) - * Solbourne OS/MP PRIOR to 4.1A - * - * LIBS: -lkvm - * - * CFLAGS: -DHAVE_GETOPT -DORDER - * - * AUTHOR: William LeFebvre <wnl@groupsys.com> - * Solbourne support by David MacKenzie <djm@eng.umd.edu> - */ - -/* - * #ifdef MULTIPROCESSOR means Sun MP. - * #ifdef solbourne is for Solbourne. - */ - -#include "config.h" -#include <sys/types.h> -#include <sys/signal.h> - -/* make sure param.h gets loaded with KERNEL defined to get PZERO & NZERO */ -#define KERNEL -#include <sys/param.h> -#undef KERNEL - -#include <stdio.h> -#include <kvm.h> -#include <nlist.h> -#include <math.h> -#include <sys/dir.h> -#include <sys/user.h> -#include <sys/proc.h> -#include <sys/dk.h> -#include <sys/vm.h> -#include <sys/file.h> -#include <sys/time.h> -#include <vm/page.h> - -#ifdef solbourne -#include <sys/syscall.h> -#endif - -/* Older versions of SunOS don't have a typedef for pid_t. - Hopefully this will catch all those cases without causing other problems. - */ -#ifndef __sys_stdtypes_h -typedef int pid_t; -#endif - -#include "pg_top.h" -#include "machine.h" -#include "utils.h" - -/* declarations for load_avg */ -#include "loadavg.h" - -/* get_process_info passes back a handle. This is what it looks like: */ - -struct handle -{ - struct proc **next_proc; /* points to next valid proc pointer */ - int remaining; /* number of pointers remaining */ -}; - -/* define what weighted cpu is. */ -#define weighted_cpu(pct, pp) ((pp)->p_time == 0 ? 0.0 : \ - ((pct) / (1.0 - exp((pp)->p_time * logcpu)))) - -/* what we consider to be process size: */ -#define PROCSIZE(pp) ((pp)->p_tsize + (pp)->p_dsize + (pp)->p_ssize) - -/* definitions for indices in the nlist array */ -#define X_AVENRUN 0 -#define X_CCPU 1 -#define X_MPID 2 -#define X_NPROC 3 -#define X_PROC 4 -#define X_TOTAL 5 -#define X_CP_TIME 6 -#define X_PAGES 7 -#define X_EPAGES 8 - -static struct nlist nlst[] = { -#ifdef i386 - {"avenrun"}, /* 0 */ - {"ccpu"}, /* 1 */ - {"mpid"}, /* 2 */ - {"nproc"}, /* 3 */ - {"proc"}, /* 4 */ - {"total"}, /* 5 */ - {"cp_time"}, /* 6 */ - {"pages"}, /* 7 */ - {"epages"}, /* 8 */ -#else - {"_avenrun"}, /* 0 */ - {"_ccpu"}, /* 1 */ - {"_mpid"}, /* 2 */ - {"_nproc"}, /* 3 */ - {"_proc"}, /* 4 */ - {"_total"}, /* 5 */ - {"_cp_time"}, /* 6 */ - {"_pages"}, /* 7 */ - {"_epages"}, /* 8 */ -#ifdef MULTIPROCESSOR - {"_ncpu"}, -#define X_NCPU 9 - {"_xp_time"}, -#define X_XP_TIME 10 -#endif -#endif - {0} -}; - -/* - * These definitions control the format of the per-process area - */ - -static char header[] = -" PID X PRI NICE SIZE RES STATE TIME WCPU CPU COMMAND"; - -/* 0123456 -- field to fill in starts at header+6 */ -#define UNAME_START 6 - -#define Proc_format \ - "%5d %-8.8s %3d %4d %5s %5s %-5s %-6s %5.2f%% %5.2f%% %s" - - -/* process state names for the "STATE" column of the display */ -/* the extra nulls in the string "run" are for adding a slash and - the processor number when needed */ - -char *state_abbrev[] = -{ - "", "sleep", "WAIT", "run\0\0\0", "start", "zomb", "stop" -}; - -/* values that we stash away in _init and use in later routines */ - -static double logcpu; -kvm_t *kd; - -/* these are retrieved from the kernel in _init */ - -static unsigned long proc; -static int nproc; -static load_avg ccpu; -static unsigned long pages; -static unsigned long epages; -static int ncpu = 0; - -/* these are offsets obtained via nlist and used in the get_ functions */ - -static unsigned long mpid_offset; -static unsigned long avenrun_offset; -static unsigned long total_offset; -static unsigned long cp_time_offset; - -#ifdef MULTIPROCESSOR -static unsigned long xp_time_offset; -#endif - -/* these are for calculating cpu state percentages */ - -static long cp_time[CPUSTATES]; -static long cp_old[CPUSTATES]; -static long cp_diff[CPUSTATES]; - -#ifdef MULTIPROCESSOR -static long xp_time[NCPU][XPSTATES]; - -/* for now we only accumulate spin time, but extending this to pick up - other stuff in xp_time is trivial. */ -static long xp_old[NCPU]; -#endif - -/* these are for detailing the process states */ - -int process_states[7]; -char *procstatenames[] = { - "", " sleeping, ", " ABANDONED, ", " running, ", " starting, ", - " zombie, ", " stopped, ", - NULL -}; - -/* these are for detailing the cpu states */ - -int cpu_states[5]; -char *cpustatenames[] = { - "user", "nice", "system", "idle", -#ifdef MULTIPROCESSOR - "spin", -#define XCP_SPIN 4 -#endif - NULL -}; - -/* these are for detailing the memory statistics */ - -long memory_stats[4]; -char *memorynames[] = { - "K available, ", "K in use, ", "K free, ", "K locked", NULL -}; - -/* these are names given to allowed sorting orders -- first is default */ -char *ordernames[] = {"cpu", "size", "res", NULL}; - -/* forward definitions for comparison functions */ -int compare_cpu(); -int compare_size(); -int compare_res(); - -int (*proc_compares[]) () = -{ - compare_cpu, - compare_size, - compare_res, - NULL -}; - - -/* these are for keeping track of the proc array */ - -static int bytes; -static int pref_len; -static struct proc *pbase; -static struct proc **pref; - -/* these are for getting the memory statistics */ - -static struct page *physpage; -static int bytesize; -static int count; -static int pageshift; /* log base 2 of the pagesize */ - -/* define pagetok in terms of pageshift */ - -#define pagetok(size) ((size) << pageshift) - -/* useful externals */ -extern int errno; -extern char *sys_errlist[]; - -long lseek(); -long time(); - -machine_init(statics) - -struct statics *statics; - -{ - register int i; - register int pagesize; - - /* initialize the kernel interface */ - if ((kd = kvm_open(NULL, NULL, NULL, O_RDONLY, "pg_top")) == NULL) - { - perror("kvm_open"); - return (-1); - } - - /* get the list of symbols we want to access in the kernel */ - if ((i = kvm_nlist(kd, nlst)) < 0) - { - fprintf(stderr, "pg_top: nlist failed\n"); - return (-1); - } - -#ifdef MULTIPROCESSOR - /* were ncpu and xp_time not found in the nlist? */ - if (i > 0 && nlst[X_NCPU].n_type == 0 && nlst[X_XP_TIME].n_type == 0) - { - /* we were compiled on an MP system but we are not running on one */ - /* so we will pretend this didn't happen and set ncpu = 1 */ - i -= 2; - ncpu = 1; - } -#endif - -#ifdef solbourne - { - unsigned int status, - type; - - /* Get the number of CPUs on this system. */ - syscall(SYS_getcpustatus, &status, &ncpu, &type); - } -#endif - - /* make sure they were all found */ - if (i > 0 && check_nlist(nlst) > 0) - { - return (-1); - } - - /* get the symbol values out of kmem */ - (void) getkval(nlst[X_PROC].n_value, (int *) (&proc), sizeof(proc), - nlst[X_PROC].n_name); - (void) getkval(nlst[X_NPROC].n_value, &nproc, sizeof(nproc), - nlst[X_NPROC].n_name); - (void) getkval(nlst[X_CCPU].n_value, (int *) (&ccpu), sizeof(ccpu), - nlst[X_CCPU].n_name); - (void) getkval(nlst[X_PAGES].n_value, (int *) (&pages), sizeof(pages), - nlst[X_PAGES].n_name); - (void) getkval(nlst[X_EPAGES].n_value, (int *) (&epages), sizeof(epages), - nlst[X_EPAGES].n_name); -#ifdef MULTIPROCESSOR - if (ncpu == 0) - { - /* if ncpu > 0 then we are not really on an MP system */ - (void) getkval(nlst[X_NCPU].n_value, (int *) (&ncpu), sizeof(ncpu), - nlst[X_NCPU].n_name); - } -#endif - - /* stash away certain offsets for later use */ - mpid_offset = nlst[X_MPID].n_value; - avenrun_offset = nlst[X_AVENRUN].n_value; - total_offset = nlst[X_TOTAL].n_value; - cp_time_offset = nlst[X_CP_TIME].n_value; -#ifdef MULTIPROCESSOR - xp_time_offset = nlst[X_XP_TIME].n_value; -#endif - - /* this is used in calculating WCPU -- calculate it ahead of time */ - logcpu = log(loaddouble(ccpu)); - - /* allocate space for proc structure array and array of pointers */ - bytes = nproc * sizeof(struct proc); - pbase = (struct proc *) malloc(bytes); - pref = (struct proc **) malloc(nproc * sizeof(struct proc *)); - - /* Just in case ... */ - if (pbase == (struct proc *) NULL || pref == (struct proc **) NULL) - { - fprintf(stderr, "pg_top: can't allocate sufficient memory\n"); - return (-1); - } - - /* allocate a table to hold all the page structs */ - bytesize = epages - pages; - count = bytesize / sizeof(struct page); - physpage = (struct page *) malloc(epages - pages); - if (physpage == NULL) - { - fprintf(stderr, "pg_top: can't allocate sufficient memory\n"); - return (-1); - } - - /* get the page size with "getpagesize" and calculate pageshift from it */ - pagesize = getpagesize(); - pageshift = 0; - while (pagesize > 1) - { - pageshift++; - pagesize >>= 1; - } - - /* we only need the amount of log(2)1024 for our conversion */ - pageshift -= LOG1024; - -#if defined(MULTIPROCESSOR) || defined(solbourne) - /* add a slash to the "run" state abbreviation */ - if (ncpu > 1) - { - state_abbrev[SRUN][3] = '/'; - } -#endif - - /* fill in the statics information */ - statics->procstate_names = procstatenames; - statics->cpustate_names = cpustatenames; - statics->memory_names = memorynames; - statics->order_names = ordernames; - - /* all done! */ - return (0); -} - -char * -format_header(uname_field) - -register char *uname_field; - -{ - register char *ptr; - - ptr = header + UNAME_START; - while (*uname_field != '\0') - { - *ptr++ = *uname_field++; - } - - return (header); -} - -void -get_system_info(si) - -struct system_info *si; - -{ - load_avg avenrun[3]; - long total; - -#ifdef MULTIPROCESSOR - long half_total; -#endif - - /* get the cp_time array */ - (void) getkval(cp_time_offset, (int *) cp_time, sizeof(cp_time), - "_cp_time"); - -#ifdef MULTIPROCESSOR - /* get the xp_time array as well */ - if (ncpu > 1) - { - (void) getkval(xp_time_offset, (int *) xp_time, sizeof(xp_time), - "_xp_time"); - } -#endif - - /* get load average array */ - (void) getkval(avenrun_offset, (int *) avenrun, sizeof(avenrun), - "_avenrun"); - - /* get mpid -- process id of last process */ - (void) getkval(mpid_offset, &(si->last_pid), sizeof(si->last_pid), - "_mpid"); - - /* get the array of physpage descriptors */ - (void) getkval(pages, (int *) physpage, bytesize, "array _page"); - - /* convert load averages to doubles */ - { - register int i; - register double *infoloadp; - register load_avg *sysloadp; - - infoloadp = si->load_avg; - sysloadp = avenrun; - for (i = 0; i < 3; i++) - { - *infoloadp++ = loaddouble(*sysloadp++); - } - } - - /* convert cp_time counts to percentages */ - total = percentages(CPUSTATES, cpu_states, cp_time, cp_old, cp_diff); - -#ifdef MULTIPROCESSOR - /* calculate spin time from all processors */ - if (ncpu > 1) - { - register int c; - register int i; - register long sum; - register long change; - - /* collect differences for each processor and add them */ - sum = 0; - for (i = 0; i < ncpu; i++) - { - c = xp_time[i][XP_SPIN]; - change = c - xp_old[i]; - if (change < 0) - { - /* counter wrapped */ - change = (long) ((unsigned long) c - - (unsigned long) xp_old[i]); - } - sum += change; - xp_old[i] = c; - } - - /* - * NOTE: I am assuming that the ticks found in xp_time are already - * included in the ticks accumulated in cp_time. To get an accurate - * reflection, therefore, we have to subtract the spin time from the - * system time and recompute those two percentages. - */ - half_total = total / 2l; - cp_diff[CP_SYS] -= sum; - cpu_states[CP_SYS] = (int) ((cp_diff[CP_SYS] * 1000 + half_total) / - total); - cpu_states[XCP_SPIN] = (int) ((sum * 1000 + half_total) / total); - } -#endif - - /* sum memory statistics */ - { - register struct page *pp; - register int cnt; - register int inuse; - register int free; - register int locked; - - /* bop thru the array counting page types */ - pp = physpage; - inuse = free = locked = 0; - for (cnt = count; --cnt >= 0; pp++) - { - if (pp->p_free) - free++; - else if (pp->p_lock || pp->p_keepcnt > 0) - locked++; - else - inuse++; - } - - /* convert memory stats to Kbytes */ - memory_stats[0] = pagetok(inuse + free); - memory_stats[1] = pagetok(inuse); - memory_stats[2] = pagetok(free); - memory_stats[3] = pagetok(locked); - } - - /* set arrays and strings */ - si->cpustates = cpu_states; - si->memory = memory_stats; -} - -static struct handle handle; - -caddr_t -get_process_info(si, sel, compare_index) - -struct system_info *si; -struct process_select *sel; -int compare_index; - -{ - register int i; - register int total_procs; - register int active_procs; - register struct proc **prefp; - register struct proc *pp; - - /* these are copied out of sel for speed */ - int show_idle; - int show_system; - int show_uid; - int show_command; - - /* read all the proc structures in one fell swoop */ - (void) getkval(proc, (int *) pbase, bytes, "proc array"); - - /* get a pointer to the states summary array */ - si->procstates = process_states; - - /* set up flags which define what we are going to select */ - show_idle = sel->idle; - show_system = sel->system; - show_uid = sel->uid != -1; - show_command = sel->command != NULL; - - /* count up process states and get pointers to interesting procs */ - total_procs = 0; - active_procs = 0; - bzero((char *) process_states, sizeof(process_states)); - prefp = pref; - for (pp = pbase, i = 0; i < nproc; pp++, i++) - { - /* - * Place pointers to each valid proc structure in pref[]. Process - * slots that are actually in use have a non-zero status field. - * Processes with SSYS set are system processes---these get ignored - * unless show_sysprocs is set. - */ - if (pp->p_stat != 0 && - (show_system || ((pp->p_flag & SSYS) == 0))) - { - total_procs++; - process_states[pp->p_stat]++; - if ((pp->p_stat != SZOMB) && - (show_idle || (pp->p_pctcpu != 0) || (pp->p_stat == SRUN)) && - (!show_uid || pp->p_uid == (uid_t) sel->uid)) - { - *prefp++ = pp; - active_procs++; - } - } - } - - /* if requested, sort the "interesting" processes */ - qsort((char *) pref, active_procs, sizeof(struct proc *), - proc_compares[compare_index]); - - /* remember active and total counts */ - si->p_total = total_procs; - si->p_active = pref_len = active_procs; - - /* pass back a handle */ - handle.next_proc = pref; - handle.remaining = active_procs; - return ((caddr_t) & handle); -} - -char fmt[MAX_COLS]; /* static area where result is built */ - -char * -format_next_process(handle, get_userid) - -caddr_t handle; -char *(*get_userid) (); - -{ - register struct proc *pp; - register long cputime; - register double pct; - struct user u; - struct handle *hp; - - /* find and remember the next proc structure */ - hp = (struct handle *) handle; - pp = *(hp->next_proc++); - hp->remaining--; - - /* get the process's user struct and set cputime */ - if (getu(pp, &u) == -1) - { - (void) strcpy(u.u_comm, "<swapped>"); - cputime = 0; - } - else - { - /* set u_comm for system processes */ - if (u.u_comm[0] == '\0') - { - if (pp->p_pid == 0) - { - (void) strcpy(u.u_comm, "Swapper"); - } - else if (pp->p_pid == 2) - { - (void) strcpy(u.u_comm, "Pager"); - } - } - - cputime = u.u_ru.ru_utime.tv_sec + u.u_ru.ru_stime.tv_sec; - } - - /* calculate the base for cpu percentages */ - pct = pctdouble(pp->p_pctcpu); - -#ifdef MULTIPROCESSOR - - /* - * If there is more than one cpu then add the processor number to the - * "run/" string. Note that this will only show up if the process is in - * the run state. Also note: when they start making Suns with more than - * 9 processors this will break since the string will then be more than 5 - * characters. - */ - if (ncpu > 1) - { - state_abbrev[SRUN][4] = (pp->p_cpuid & 0xf) + '0'; - } -#endif -#ifdef solbourne - if (ncpu > 1) - { - state_abbrev[SRUN][4] = (pp->p_lastcpu) + '0'; - } -#endif - - /* format this entry */ - sprintf(fmt, - Proc_format, - pp->p_pid, - (*get_userid) (pp->p_uid), - pp->p_pri - PZERO, - pp->p_nice - NZERO, - format_k(pagetok(PROCSIZE(pp))), - format_k(pagetok(pp->p_rssize)), - state_abbrev[pp->p_stat], - format_time(cputime), - 100.0 * weighted_cpu(pct, pp), - 100.0 * pct, - printable(u.u_comm)); - - /* return the result */ - return (fmt); -} - -/* - * getu(p, u) - get the user structure for the process whose proc structure - * is pointed to by p. The user structure is put in the buffer pointed - * to by u. Return 0 if successful, -1 on failure (such as the process - * being swapped out). - */ - -getu(p, u) - -register struct proc *p; -struct user *u; - -{ - register struct user *lu; - - lu = kvm_getu(kd, p); - if (lu == NULL) - { - return (-1); - } - else - { - *u = *lu; - return (0); - } -} - -/* - * check_nlist(nlst) - checks the nlist to see if any symbols were not - * found. For every symbol that was not found, a one-line - * message is printed to stderr. The routine returns the - * number of symbols NOT found. - */ - -int -check_nlist(nlst) - -register struct nlist *nlst; - -{ - register int i; - - /* check to see if we got ALL the symbols we requested */ - /* this will write one line to stderr for every symbol not found */ - - i = 0; - while (nlst->n_name != NULL) - { -#ifdef i386 - if (nlst->n_value == 0) -#else - if (nlst->n_type == 0) -#endif - { - /* this one wasn't found */ - fprintf(stderr, "kernel: no symbol named `%s'\n", nlst->n_name); - i = 1; - } - nlst++; - } - - return (i); -} - - -/* - * getkval(offset, ptr, size, refstr) - get a value out of the kernel. - * "offset" is the byte offset into the kernel for the desired value, - * "ptr" points to a buffer into which the value is retrieved, - * "size" is the size of the buffer (and the object to retrieve), - * "refstr" is a reference string used when printing error meessages, - * if "refstr" starts with a '!', then a failure on read will not - * be fatal (this may seem like a silly way to do things, but I - * really didn't want the overhead of another argument). - * - */ - -getkval(offset, ptr, size, refstr) - -unsigned long offset; -int *ptr; -int size; -char *refstr; - -{ - if (kvm_read(kd, offset, ptr, size) != size) - { - if (*refstr == '!') - { - return (0); - } - else - { - fprintf(stderr, "pg_top: kvm_read for %s: %s\n", - refstr, sys_errlist[errno]); - quit(23); - /* NOTREACHED */ - } - } - return (1); -} - -/* comparison routines for qsort */ - -/* - * 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. - */ - -/* 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 = p2->p_pctcpu - p1->p_pctcpu,\ - (result = lresult > 0 ? 1 : lresult < 0 ? -1 : 0) == 0) -#define ORDERKEY_CPTICKS if ((result = p2->p_cpticks - p1->p_cpticks) == 0) -#define ORDERKEY_STATE if ((result = sorted_state[p2->p_stat] - \ - sorted_state[p1->p_stat]) == 0) -#define ORDERKEY_PRIO if ((result = p2->p_pri - p1->p_pri) == 0) -#define ORDERKEY_RSSIZE if ((result = p2->p_rssize - p1->p_rssize) == 0) -#define ORDERKEY_MEM if ((result = PROCSIZE(p2) - PROCSIZE(p1)) == 0) - -/* Now the array that maps process state to a weight */ - -static unsigned char sorted_state[] = -{ - 0, /* not used */ - 3, /* sleep */ - 1, /* ABANDONED (WAIT) */ - 6, /* run */ - 5, /* start */ - 2, /* zombie */ - 4 /* stop */ -}; - -/* compare_cpu - the comparison function for sorting by cpu percentage */ - -compare_cpu(pp1, pp2) - -struct proc **pp1; -struct proc **pp2; - -{ - register struct proc *p1; - register struct proc *p2; - register int result; - register pctcpu lresult; - - /* remove one level of indirection */ - p1 = *pp1; - p2 = *pp2; - - ORDERKEY_PCTCPU - ORDERKEY_CPTICKS - ORDERKEY_STATE - ORDERKEY_PRIO - ORDERKEY_RSSIZE - ORDERKEY_MEM - ; - - return (result); -} - -/* compare_size - the comparison function for sorting by total memory usage */ - -compare_size(pp1, pp2) - -struct proc **pp1; -struct proc **pp2; - -{ - register struct proc *p1; - register struct proc *p2; - register int result; - register pctcpu lresult; - - /* remove one level of indirection */ - p1 = *pp1; - p2 = *pp2; - - ORDERKEY_MEM - ORDERKEY_RSSIZE - ORDERKEY_PCTCPU - ORDERKEY_CPTICKS - ORDERKEY_STATE - ORDERKEY_PRIO - ; - - return (result); -} - -/* compare_res - the comparison function for sorting by resident set size */ - -compare_res(pp1, pp2) - -struct proc **pp1; -struct proc **pp2; - -{ - register struct proc *p1; - register struct proc *p2; - register int result; - register pctcpu lresult; - - /* remove one level of indirection */ - p1 = *pp1; - p2 = *pp2; - - ORDERKEY_RSSIZE - ORDERKEY_MEM - ORDERKEY_PCTCPU - ORDERKEY_CPTICKS - ORDERKEY_STATE - ORDERKEY_PRIO - ; - - return (result); -} - -/* - * proc_owner(pid) - returns the uid that owns process "pid", or -1 if - * the process does not exist. - * It is EXTREMLY IMPORTANT that this function work correctly. - * If pg_top runs setuid root (as in SVR4), then this function - * is the only thing that stands in the way of a serious - * security problem. It validates requests for the "kill" - * and "renice" commands. - */ - -int -proc_owner(pid) - -int pid; - -{ - register int cnt; - register struct proc **prefp; - register struct proc *pp; - - prefp = pref; - cnt = pref_len; - while (--cnt >= 0) - { - if ((pp = *prefp++)->p_pid == (pid_t) pid) - { - return ((int) pp->p_uid); - } - } - return (-1); -} diff --git a/machine/m_sunos4.man b/machine/m_sunos4.man deleted file mode 100644 index a5062d1..0000000 --- a/machine/m_sunos4.man +++ /dev/null @@ -1,23 +0,0 @@ -.SH "SUNOS 4 DIFFERENCES" -On multiprocessor machines, the amount of time the processors spend in -a spin lock is displayed along with the other processor state -percentages. The percentages shown for processor states are averages -across all processors. A process in run state also has its current -processor displayed in the STATE column, for example "run/2" indicates -running on processor 2. There is an extra column in the process -display indicating which processor each running process is assigned -to. Information about physical memory is displayed on the memory -status line, but information about virtual memory is not available. - -Due to incompatabilities in kernel data structures, a pg_top executable -compiled on a Sun 4 multiprocessor architecture machine (sun4m) will -not run correctly on a uniprocessor architecture machine (sun4), and -vice versa. You will have to compile and maintain separate executables -for these architectures. Yeah, I don't like it either. - -Some processes may show up with a resident set size (RES column) larger -than total virtual memory size (SIZE column). This seems odd at first, -but is a consequence of shared libraries: shared memory is counted as -resident but is not counted in total size. - -The SunOS 4 port was written by William LeFebvre. |