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