range check number of swap devices
[unix-history] / usr / src / usr.bin / systat / pigs.c
CommitLineData
07ed1e09
KM
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
1cd14d1e 7#ifndef lint
c0b7e584 8static char sccsid[] = "@(#)pigs.c 5.4 (Berkeley) %G%";
07ed1e09
KM
9#endif not lint
10
11/*
12 * Pigs display from Bill Reeves at Lucasfilm
13 */
1cd14d1e
SL
14
15#include "systat.h"
855ff304
KM
16#include <sys/dir.h>
17#include <sys/time.h>
18#include <sys/proc.h>
bb15a69f 19#include <sys/dk.h>
855ff304 20#include <pwd.h>
1cd14d1e 21
d830bff6
SL
22WINDOW *
23openpigs()
24{
d830bff6 25
b5eefd1e 26 return (subwin(stdscr, LINES-5-1, 0, 5, 0));
d830bff6
SL
27}
28
29closepigs(w)
30 WINDOW *w;
31{
32
33 if (w == NULL)
34 return;
d830bff6
SL
35 wclear(w);
36 wrefresh(w);
b5eefd1e 37 delwin(w);
d830bff6
SL
38}
39
855ff304
KM
40int maxind;
41int factor;
42float total;
43struct passwd *getpwuid();
44char pidname[30];
bb15a69f
KM
45long stime[CPUSTATES];
46double idle;
855ff304 47
1cd14d1e
SL
48showpigs()
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
d830bff6
SL
58 if (pt == NULL)
59 return;
1cd14d1e
SL
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
ae4efee0
KM
76 pt[numprocs].pt_pctcpu = idle;
77 total += idle;
1cd14d1e
SL
78 pt[numprocs].pt_uid = -1;
79 pt[numprocs].pt_pid = -1;
80 pt[numprocs].pt_pp = NULL;
81
ae4efee0
KM
82 if (total < 1.0)
83 total = 1.0;
1cd14d1e
SL
84 factor = 50.0/total;
85
b5eefd1e
SL
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;
1cd14d1e
SL
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 }
b5eefd1e 107 y = 1;
1cd14d1e 108 ptptr = pt;
b5eefd1e
SL
109 i = numprocs + 1;
110 if (i > wnd->_maxy-1)
111 i = wnd->_maxy-1;
1cd14d1e
SL
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);
83e2d91b
SL
138 sprintf(pidname, "%10.10s", pnamp);
139 mvwaddstr(wnd, y, 9, pidname);
140 wmove(wnd, y++, 20);
1cd14d1e
SL
141 for (j = ptptr->pt_pctcpu*factor + 0.5; j > 0; j--)
142 waddch(wnd, 'X');
143 ptptr++;
144 }
b5eefd1e 145 wmove(wnd, y, 0); wclrtobot(wnd);
1cd14d1e
SL
146}
147
d830bff6 148static struct nlist nlst[] = {
1cd14d1e 149#define X_PROC 0
d830bff6 150 { "_proc" },
1cd14d1e 151#define X_NPROC 1
d830bff6
SL
152 { "_nproc" },
153#define X_USRPTMAP 2
154 { "_Usrptmap" },
155#define X_USRPT 3
156 { "_usrpt" },
bb15a69f
KM
157#define X_CPTIME 4
158 { "_cp_time" },
d830bff6
SL
159 { "" }
160};
1cd14d1e 161
852c7064 162initpigs()
1cd14d1e 163{
1cd14d1e 164
d830bff6
SL
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");
c0b7e584 169 return(0);
d830bff6
SL
170 }
171 }
1cd14d1e
SL
172 if (procp == NULL) {
173 procp = getw(nlst[X_PROC].n_value);
174 nproc = getw(nlst[X_NPROC].n_value);
1cd14d1e 175 }
c6265927
SL
176 if (kprocp == NULL)
177 kprocp = (struct proc *)calloc(nproc, sizeof (struct proc));
852c7064 178 if (usrpt != NULL)
c0b7e584 179 return(1);
852c7064
SL
180 usrpt = (struct pte *)nlst[X_USRPT].n_value;
181 Usrptma = (struct pte *)nlst[X_USRPTMAP].n_value;
c6265927
SL
182 if (pt == NULL)
183 pt = (struct p_times *)calloc(nproc, sizeof (struct p_times));
bb15a69f
KM
184 lseek(kmem, (long)nlst[X_CPTIME].n_value, L_SET);
185 read(kmem, stime, sizeof stime);
c0b7e584 186 return(1);
852c7064
SL
187}
188
189fetchpigs()
190{
191 register int i;
192 register struct p_times *prt;
193 register float time;
194 register struct proc *pp;
bb15a69f 195 long ctime[CPUSTATES];
bb15a69f 196 double t;
852c7064 197
d830bff6
SL
198 if (nlst[X_PROC].n_type == 0)
199 return;
c6265927
SL
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 }
1cd14d1e
SL
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;
bb15a69f
KM
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];
1cd14d1e
SL
235}
236
237labelpigs()
238{
239
b5eefd1e
SL
240 wmove(wnd, 0, 0); wclrtoeol(wnd);
241 mvwaddstr(wnd, 0, 20,
1cd14d1e
SL
242 "/0 /10 /20 /30 /40 /50 /60 /70 /80 /90 /100");
243}