|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: static char sccsid[] = "@(#)pigs.c 5.4 (Berkeley) 12/11/85"; ! 9: #endif not lint ! 10: ! 11: /* ! 12: * Pigs display from Bill Reeves at Lucasfilm ! 13: */ ! 14: ! 15: #include "systat.h" ! 16: #include <sys/dir.h> ! 17: #include <sys/time.h> ! 18: #include <sys/proc.h> ! 19: #include <sys/dk.h> ! 20: #include <pwd.h> ! 21: ! 22: WINDOW * ! 23: openpigs() ! 24: { ! 25: ! 26: return (subwin(stdscr, LINES-5-1, 0, 5, 0)); ! 27: } ! 28: ! 29: closepigs(w) ! 30: WINDOW *w; ! 31: { ! 32: ! 33: if (w == NULL) ! 34: return; ! 35: wclear(w); ! 36: wrefresh(w); ! 37: delwin(w); ! 38: } ! 39: ! 40: int maxind; ! 41: int factor; ! 42: float total; ! 43: struct passwd *getpwuid(); ! 44: char pidname[30]; ! 45: long stime[CPUSTATES]; ! 46: double idle; ! 47: ! 48: showpigs() ! 49: { ! 50: register short auid; ! 51: register int i, j, y; ! 52: register float max; ! 53: register struct p_times *ptptr; ! 54: struct p_times temppt; ! 55: register struct users *knptr; ! 56: char *getpname(), *pnamp; ! 57: ! 58: if (pt == NULL) ! 59: return; ! 60: /* Accumulate the percent of cpu per user. */ ! 61: ptptr = pt; ! 62: numprocs = 0; ! 63: total = 0.0; ! 64: for (i = 0; i < nproc; i++) { ! 65: /* discard inactive processes */ ! 66: if (ptptr->pt_uid == -1) { ! 67: ptptr++; ! 68: continue; ! 69: } ! 70: /* Accumulate the percentage. */ ! 71: total += ptptr->pt_pctcpu; ! 72: numprocs++; ! 73: ptptr++; ! 74: } ! 75: ! 76: pt[numprocs].pt_pctcpu = idle; ! 77: total += idle; ! 78: pt[numprocs].pt_uid = -1; ! 79: pt[numprocs].pt_pid = -1; ! 80: pt[numprocs].pt_pp = NULL; ! 81: ! 82: if (total < 1.0) ! 83: total = 1.0; ! 84: factor = 50.0/total; ! 85: ! 86: /* Find the top few by executing a "bubble pass" ten times. */ ! 87: y = numprocs + 1; ! 88: if (y > wnd->_maxy-1) ! 89: y = wnd->_maxy-1; ! 90: for (i = 0; i < y; i++) { ! 91: ptptr = &pt[i]; ! 92: max = -10000.0; ! 93: maxind = i; ! 94: for (j = i; j < numprocs + 1; j++) { ! 95: if (ptptr->pt_pctcpu > max) { ! 96: max = ptptr->pt_pctcpu; ! 97: maxind = j; ! 98: } ! 99: ptptr++; ! 100: } ! 101: if (maxind != i) { ! 102: temppt = pt[i]; ! 103: pt[i] = pt[maxind]; ! 104: pt[maxind] = temppt; ! 105: } ! 106: } ! 107: y = 1; ! 108: ptptr = pt; ! 109: i = numprocs + 1; ! 110: if (i > wnd->_maxy-1) ! 111: i = wnd->_maxy-1; ! 112: for (; i > 0 && ptptr->pt_pctcpu > 0.01; i--) { ! 113: /* Find the user's name. */ ! 114: knptr = known; ! 115: auid = ptptr->pt_uid; ! 116: for (j = numknown - 1; j >= 0; j--) { ! 117: if (knptr->k_uid == auid) { ! 118: namp = knptr->k_name; ! 119: break; ! 120: } ! 121: knptr++; ! 122: } ! 123: if (j < 0) { ! 124: if (numknown < 30) { ! 125: knptr = &known[numknown]; ! 126: namp = strncpy(knptr->k_name, ! 127: getpwuid(auid)->pw_name, 15); ! 128: knptr->k_name[15] = '\0'; ! 129: knptr->k_uid = auid; ! 130: numknown++; ! 131: } else ! 132: namp = getpwuid(auid)-> pw_name; ! 133: } ! 134: pnamp = getpname(ptptr->pt_pid, ptptr->pt_pp); ! 135: wmove(wnd, y, 0); ! 136: wclrtoeol(wnd); ! 137: mvwaddstr(wnd, y, 0, namp); ! 138: sprintf(pidname, "%10.10s", pnamp); ! 139: mvwaddstr(wnd, y, 9, pidname); ! 140: wmove(wnd, y++, 20); ! 141: for (j = ptptr->pt_pctcpu*factor + 0.5; j > 0; j--) ! 142: waddch(wnd, 'X'); ! 143: ptptr++; ! 144: } ! 145: wmove(wnd, y, 0); wclrtobot(wnd); ! 146: } ! 147: ! 148: static struct nlist nlst[] = { ! 149: #define X_PROC 0 ! 150: { "_proc" }, ! 151: #define X_NPROC 1 ! 152: { "_nproc" }, ! 153: #define X_USRPTMAP 2 ! 154: { "_Usrptmap" }, ! 155: #define X_USRPT 3 ! 156: { "_usrpt" }, ! 157: #define X_CPTIME 4 ! 158: { "_cp_time" }, ! 159: { "" } ! 160: }; ! 161: ! 162: initpigs() ! 163: { ! 164: ! 165: if (nlst[X_PROC].n_type == 0) { ! 166: nlist("/vmunix", nlst); ! 167: if (nlst[X_PROC].n_type == 0) { ! 168: error("namelist on /vmunix failed"); ! 169: return(0); ! 170: } ! 171: } ! 172: if (procp == NULL) { ! 173: procp = getw(nlst[X_PROC].n_value); ! 174: nproc = getw(nlst[X_NPROC].n_value); ! 175: } ! 176: if (kprocp == NULL) ! 177: kprocp = (struct proc *)calloc(nproc, sizeof (struct proc)); ! 178: if (usrpt != NULL) ! 179: return(1); ! 180: usrpt = (struct pte *)nlst[X_USRPT].n_value; ! 181: Usrptma = (struct pte *)nlst[X_USRPTMAP].n_value; ! 182: if (pt == NULL) ! 183: pt = (struct p_times *)calloc(nproc, sizeof (struct p_times)); ! 184: lseek(kmem, (long)nlst[X_CPTIME].n_value, L_SET); ! 185: read(kmem, stime, sizeof stime); ! 186: return(1); ! 187: } ! 188: ! 189: fetchpigs() ! 190: { ! 191: register int i; ! 192: register struct p_times *prt; ! 193: register float time; ! 194: register struct proc *pp; ! 195: long ctime[CPUSTATES]; ! 196: double t; ! 197: ! 198: if (nlst[X_PROC].n_type == 0) ! 199: return; ! 200: if (kprocp == NULL) { ! 201: kprocp = (struct proc *)calloc(nproc, sizeof (struct proc)); ! 202: if (kprocp == NULL) ! 203: return; ! 204: } ! 205: if (pt == NULL) { ! 206: pt = (struct p_times *)calloc(nproc, sizeof (struct p_times)); ! 207: if (pt == NULL) ! 208: return; ! 209: } ! 210: prt = pt; ! 211: lseek(kmem, procp, L_SET); ! 212: read(kmem, kprocp, sizeof (struct proc) * nproc); ! 213: for (i = 0, pp = kprocp; i < nproc; i++, pp++) { ! 214: time = pp->p_time; ! 215: if (time == 0 || (pp->p_flag & SLOAD) == 0) ! 216: continue; ! 217: prt->pt_pid = pp->p_pid; ! 218: prt->pt_pp = pp; ! 219: prt->pt_pctcpu = pp->p_pctcpu / (1.0 - exp(time * lccpu)); ! 220: prt->pt_uid = pp->p_uid; ! 221: prt++; ! 222: } ! 223: for (; prt < &pt[nproc]; prt++) ! 224: prt->pt_uid = -1; ! 225: lseek(kmem, (long)nlst[X_CPTIME].n_value, L_SET); ! 226: read(kmem, ctime, sizeof ctime); ! 227: t = 0; ! 228: for (i = 0; i < CPUSTATES; i++) ! 229: t += ctime[i] - stime[i]; ! 230: if (t == 0.0) ! 231: t = 1.0; ! 232: idle = (ctime[CP_IDLE] - stime[CP_IDLE]) / t; ! 233: for (i = 0; i < CPUSTATES; i++) ! 234: stime[i] = ctime[i]; ! 235: } ! 236: ! 237: labelpigs() ! 238: { ! 239: ! 240: wmove(wnd, 0, 0); wclrtoeol(wnd); ! 241: mvwaddstr(wnd, 0, 20, ! 242: "/0 /10 /20 /30 /40 /50 /60 /70 /80 /90 /100"); ! 243: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.