2 * Copyright (c) 1980, 1992, 1993
3 * The Regents of the University of California. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 static char sccsid
[] = "@(#)pigs.c 8.2 (Berkeley) 9/23/93";
40 #include <sys/cdefs.h>
41 __FBSDID("$FreeBSD$");
44 * Pigs display from Bill Reeves at Lucasfilm
47 #include <sys/param.h>
49 #include <sys/sysctl.h>
61 int compar(const void *, const void *);
64 static struct p_times
{
66 struct kinfo_proc
*pt_kp
;
75 return (subwin(stdscr
, LINES
-3-1, 0, MAINWIN_ROW
, 0));
93 const char *uname
, *pname
;
99 qsort(pt
, nproc
, sizeof (struct p_times
), compar
);
102 if (i
> wnd
->_maxy
-1)
104 for (k
= 0; i
> 0 && pt
[k
].pt_pctcpu
> 0.01; i
--, y
++, k
++) {
105 uname
= user_from_uid(pt
[k
].pt_kp
->ki_uid
, 0);
106 pname
= pt
[k
].pt_kp
->ki_comm
;
109 mvwaddstr(wnd
, y
, 0, uname
);
110 snprintf(pidname
, sizeof(pidname
), "%10.10s", pname
);
111 mvwaddstr(wnd
, y
, 9, pidname
);
113 for (j
= pt
[k
].pt_pctcpu
* 50 + 0.5; j
> 0; j
--)
116 wmove(wnd
, y
, 0); wclrtobot(wnd
);
127 err
= sysctlbyname("kern.ccpu", &ccpu
, &len
, NULL
, 0);
128 if (err
|| len
!= sizeof(ccpu
)) {
133 len
= sizeof(fscale
);
134 err
= sysctlbyname("kern.fscale", &fscale
, &len
, NULL
, 0);
135 if (err
|| len
!= sizeof(fscale
)) {
136 perror("kern.fscale");
140 lccpu
= log((double) ccpu
/ fscale
);
151 struct kinfo_proc
*kpp
;
152 static int lastnproc
= 0;
154 if ((kpp
= kvm_getprocs(kd
, KERN_PROC_ALL
, 0, &nproc
)) == NULL
) {
155 error("%s", kvm_geterr(kd
));
160 if (nproc
> lastnproc
) {
163 malloc(nproc
* sizeof(struct p_times
))) == NULL
) {
164 error("Out of memory");
170 * calculate %cpu for each proc
172 for (i
= 0; i
< nproc
; i
++) {
173 pt
[i
].pt_kp
= &kpp
[i
];
174 pctp
= &pt
[i
].pt_pctcpu
;
175 ftime
= kpp
[i
].ki_swtime
;
176 if (ftime
== 0 || (kpp
[i
].ki_flag
& P_INMEM
) == 0)
179 *pctp
= ((double) kpp
[i
].ki_pctcpu
/
180 fscale
) / (1.0 - exp(ftime
* lccpu
));
189 mvwaddstr(wnd
, 0, 20,
190 "/0% /10 /20 /30 /40 /50 /60 /70 /80 /90 /100");
194 compar(const void *a
, const void *b
)
196 return (((const struct p_times
*) a
)->pt_pctcpu
>
197 ((const struct p_times
*) b
)->pt_pctcpu
)? -1: 1;