Use kinfo_proc2.

This commit is contained in:
thorpej 2002-05-04 18:44:27 +00:00
parent 8e978787e8
commit 477d91c699
3 changed files with 77 additions and 93 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: pigs.c,v 1.21 2000/12/01 02:19:44 simonb Exp $ */
/* $NetBSD: pigs.c,v 1.22 2002/05/04 18:44:27 thorpej Exp $ */
/*-
* Copyright (c) 1980, 1992, 1993
@ -38,7 +38,7 @@
#if 0
static char sccsid[] = "@(#)pigs.c 8.2 (Berkeley) 9/23/93";
#endif
__RCSID("$NetBSD: pigs.c,v 1.21 2000/12/01 02:19:44 simonb Exp $");
__RCSID("$NetBSD: pigs.c,v 1.22 2002/05/04 18:44:27 thorpej Exp $");
#endif /* not lint */
/*
@ -96,7 +96,7 @@ void
showpigs(void)
{
int i, y, k;
struct eproc *ep;
struct kinfo_proc2 *kp;
float total;
int factor;
const char *pname;
@ -127,10 +127,11 @@ showpigs(void)
usrstr[0] = '\0';
}
else {
ep = &pt[k].pt_kp->kp_eproc;
pname = pt[k].pt_kp->kp_proc.p_comm;
snprintf(pidstr, sizeof(pidstr), "%5d", pt[k].pt_kp->kp_proc.p_pid);
snprintf(usrstr, sizeof(usrstr), "%8s", user_from_uid(ep->e_ucred.cr_uid, 0));
kp = pt[k].pt_kp;
pname = kp->p_comm;
snprintf(pidstr, sizeof(pidstr), "%5d", kp->p_pid);
snprintf(usrstr, sizeof(usrstr), "%8s",
user_from_uid(kp->p_uid, 0));
}
wmove(wnd, y, 0);
wclrtoeol(wnd);
@ -183,16 +184,16 @@ fetchpigs(void)
{
int i;
float time;
struct proc *pp;
float *pctp;
struct kinfo_proc *kpp;
struct kinfo_proc2 *kpp, *k;
u_int64_t ctime[CPUSTATES];
double t;
static int lastnproc = 0;
if (namelist[X_FIRST].n_type == 0)
return;
if ((kpp = kvm_getprocs(kd, KERN_PROC_ALL, 0, &nproc)) == NULL) {
if ((kpp = kvm_getproc2(kd, KERN_PROC_ALL, 0, sizeof(*kpp),
&nproc)) == NULL) {
error("%s", kvm_geterr(kd));
if (pt)
free(pt);
@ -211,15 +212,15 @@ fetchpigs(void)
* calculate %cpu for each proc
*/
for (i = 0; i < nproc; i++) {
pt[i].pt_kp = &kpp[i];
pp = &kpp[i].kp_proc;
pt[i].pt_kp = k = &kpp[i];
pctp = &pt[i].pt_pctcpu;
time = pp->p_swtime;
if (P_ZOMBIE(pp) ||
time == 0 || (pp->p_flag & P_INMEM) == 0)
time = k->p_swtime;
/* XXX - I don't like this */
if (k->p_swtime == 0 || (k->p_flag & P_INMEM) == 0 ||
k->p_stat == SZOMB || k->p_stat == SDEAD)
*pctp = 0;
else
*pctp = ((double) pp->p_pctcpu /
*pctp = ((double) k->p_pctcpu /
fscale) / (1.0 - exp(time * lccpu));
}
/*

View File

@ -1,4 +1,4 @@
/* $NetBSD: ps.c,v 1.19 2001/07/14 07:09:11 matt Exp $ */
/* $NetBSD: ps.c,v 1.20 2002/05/04 18:44:27 thorpej Exp $ */
/*-
* Copyright (c) 1999
@ -45,7 +45,7 @@
#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: ps.c,v 1.19 2001/07/14 07:09:11 matt Exp $");
__RCSID("$NetBSD: ps.c,v 1.20 2002/05/04 18:44:27 thorpej Exp $");
#endif /* not lint */
#include <sys/param.h>
@ -66,14 +66,14 @@ __RCSID("$NetBSD: ps.c,v 1.19 2001/07/14 07:09:11 matt Exp $");
#include "ps.h"
int compare_pctcpu_noidle(const void *, const void *);
char *state2str(struct kinfo_proc *);
char *tty2str(struct kinfo_proc *);
int rss2int(struct kinfo_proc *);
int vsz2int(struct kinfo_proc *);
char *comm2str(struct kinfo_proc *);
double pmem2float(struct kinfo_proc *);
char *start2str(struct kinfo_proc *);
char *time2str(struct kinfo_proc *);
char *state2str(struct kinfo_proc2 *);
char *tty2str(struct kinfo_proc2 *);
int rss2int(struct kinfo_proc2 *);
int vsz2int(struct kinfo_proc2 *);
char *comm2str(struct kinfo_proc2 *);
double pmem2float(struct kinfo_proc2 *);
char *start2str(struct kinfo_proc2 *);
char *time2str(struct kinfo_proc2 *);
static time_t now;
@ -97,7 +97,7 @@ showps(void)
const char *user, *comm, *state, *tty, *start, *time;
pid_t pid;
double pctcpu, pctmem;
struct eproc *ep;
struct kinfo_proc2 *kp;
now = 0; /* force start2str to reget current time */
@ -111,11 +111,11 @@ showps(void)
if (pt[k].pt_kp == NULL) /* We're all the way down to the imaginary idle proc */
break;
ep = &pt[k].pt_kp->kp_eproc;
if (showuser != SHOWUSER_ANY && ep->e_ucred.cr_uid != showuser)
kp = pt[k].pt_kp;
if (showuser != SHOWUSER_ANY && kp->p_uid != showuser)
continue;
user = user_from_uid(ep->e_ucred.cr_uid, 0);
pid = pt[k].pt_kp->kp_proc.p_pid;
user = user_from_uid(kp->p_uid, 0);
pid = kp->p_pid;
pctcpu = 100.0 * pt[k].pt_pctcpu;
pctmem = pmem2float(pt[k].pt_kp);
vsz = vsz2int(pt[k].pt_kp);
@ -153,29 +153,24 @@ compare_pctcpu_noidle(const void *a, const void *b)
/* from here down adapted from .../src/usr.bin/ps/print.c . Any mistakes are my own, however. */
char *
state2str(struct kinfo_proc *kp)
state2str(struct kinfo_proc2 *kp)
{
struct proc *p;
struct eproc *e;
int flag;
char *cp;
char buf[5];
static char statestr[4];
p = &(kp->kp_proc);
e = &(kp->kp_eproc);
flag = p->p_flag;
flag = kp->p_flag;
cp = buf;
switch (p->p_stat) {
switch (kp->p_stat) {
case SSTOP:
*cp = 'T';
break;
case SSLEEP:
if (flag & P_SINTR) /* interuptable (long) */
*cp = p->p_slptime >= maxslp ? 'I' : 'S';
*cp = kp->p_slptime >= maxslp ? 'I' : 'S';
else
*cp = 'D';
break;
@ -200,21 +195,23 @@ state2str(struct kinfo_proc *kp)
if (flag & P_INMEM) {
} else
*cp++ = 'W';
if (p->p_nice < NZERO)
if (kp->p_nice < NZERO)
*cp++ = '<';
else if (p->p_nice > NZERO)
else if (kp->p_nice > NZERO)
*cp++ = 'N';
if (flag & P_TRACED)
*cp++ = 'X';
if (flag & P_WEXIT && P_ZOMBIE(p) == 0)
if (flag & P_WEXIT &&
/* XXX - I don't like this */
(kp->p_stat == SZOMB || kp->p_stat == SDEAD) == 0)
*cp++ = 'E';
if (flag & P_PPWAIT)
*cp++ = 'V';
if ((flag & P_SYSTEM) || p->p_holdcnt)
if ((flag & P_SYSTEM) || kp->p_holdcnt)
*cp++ = 'L';
if (e->e_flag & EPROC_SLEADER)
if (kp->p_eflag & EPROC_SLEADER)
*cp++ = 's';
if ((flag & P_CONTROLT) && e->e_pgid == e->e_tpgid)
if ((flag & P_CONTROLT) && kp->p__pgid == kp->p_tpgid)
*cp++ = '+';
*cp = '\0';
snprintf(statestr, sizeof(statestr), "%-s", buf);
@ -223,21 +220,20 @@ state2str(struct kinfo_proc *kp)
}
char *
tty2str(struct kinfo_proc *kp)
tty2str(struct kinfo_proc2 *kp)
{
static char ttystr[4];
char *ttyname;
struct eproc *e;
e = &(kp->kp_eproc);
if (e->e_tdev == NODEV || (ttyname = devname(e->e_tdev, S_IFCHR)) == NULL)
if (kp->p_tdev == NODEV ||
(ttyname = devname(kp->p_tdev, S_IFCHR)) == NULL)
strcpy(ttystr, "??");
else {
if (strncmp(ttyname, "tty", 3) == 0 ||
strncmp(ttyname, "dty", 3) == 0)
ttyname += 3;
snprintf(ttystr, sizeof(ttystr), "%s%c", ttyname, e->e_flag & EPROC_CTTY ? ' ' : '-');
snprintf(ttystr, sizeof(ttystr), "%s%c", ttyname,
kp->p_eflag & EPROC_CTTY ? ' ' : '-');
}
return ttystr;
@ -246,41 +242,35 @@ tty2str(struct kinfo_proc *kp)
#define pgtok(a) (((a)*getpagesize())/1024)
int
vsz2int(struct kinfo_proc *kp)
vsz2int(struct kinfo_proc2 *kp)
{
struct eproc *e;
int i;
e = &(kp->kp_eproc);
i = pgtok(e->e_vm.vm_dsize + e->e_vm.vm_ssize + e->e_vm.vm_tsize);
i = pgtok(kp->p_vm_dsize + kp->p_vm_ssize + kp->p_vm_tsize);
return ((i < 0) ? 0 : i);
}
}
int
rss2int(struct kinfo_proc *kp)
rss2int(struct kinfo_proc2 *kp)
{
struct eproc *e;
int i;
e = &(kp->kp_eproc);
i = pgtok(e->e_vm.vm_rssize);
i = pgtok(kp->p_vm_rssize);
/* XXX don't have info about shared */
return ((i < 0) ? 0 : i);
}
char *
comm2str(struct kinfo_proc *kp)
comm2str(struct kinfo_proc2 *kp)
{
char **argv, **pt;
static char commstr[41];
struct proc *p;
p = &(kp->kp_proc);
commstr[0]='\0';
argv = kvm_getargv(kd, kp, 40);
argv = kvm_getargv2(kd, kp, 40);
if ((pt = argv) != NULL) {
while (*pt) {
strcat(commstr, *pt);
@ -290,7 +280,7 @@ comm2str(struct kinfo_proc *kp)
} else {
commstr[0] = '(';
commstr[1] = '\0';
strncat(commstr, p->p_comm, sizeof(commstr) - 1);
strncat(commstr, kp->p_comm, sizeof(commstr) - 1);
strcat(commstr, ")");
}
@ -298,41 +288,33 @@ comm2str(struct kinfo_proc *kp)
}
double
pmem2float(struct kinfo_proc *kp)
pmem2float(struct kinfo_proc2 *kp)
{
struct proc *p;
struct eproc *e;
double fracmem;
int szptudot = 0;
p = &(kp->kp_proc);
e = &(kp->kp_eproc);
if ((p->p_flag & P_INMEM) == 0)
/* XXX - I don't like this. */
if ((kp->p_flag & P_INMEM) == 0)
return (0.0);
#ifdef USPACE
/* XXX want pmap ptpages, segtab, etc. (per architecture) */
szptudot = USPACE/getpagesize();
#endif
/* XXX don't have info about shared */
fracmem = ((double)e->e_vm.vm_rssize + szptudot)/mempages;
fracmem = ((double)kp->p_vm_rssize + szptudot)/mempages;
return (fracmem >= 0) ? 100.0 * fracmem : 0;
}
char *
start2str(struct kinfo_proc *kp)
start2str(struct kinfo_proc2 *kp)
{
struct proc *p;
struct pstats pstats;
struct timeval u_start;
struct tm *tp;
time_t startt;
static char startstr[10];
p = &(kp->kp_proc);
kvm_read(kd, (u_long)&(p->p_addr->u_stats), (char *)&pstats, sizeof(pstats));
u_start = pstats.p_start;
u_start.tv_sec = kp->p_ustart_sec;
u_start.tv_usec = kp->p_ustart_usec;
startt = u_start.tv_sec;
tp = localtime(&startt);
@ -353,16 +335,14 @@ start2str(struct kinfo_proc *kp)
}
char *
time2str(struct kinfo_proc *kp)
time2str(struct kinfo_proc2 *kp)
{
long secs;
long psecs; /* "parts" of a second. first micro, then centi */
static char timestr[10];
struct proc *p;
p = &(kp->kp_proc);
if (P_ZOMBIE(p)) {
/* XXX - I don't like this. */
if (kp->p_stat == SZOMB || kp->p_stat == SDEAD) {
secs = 0;
psecs = 0;
} else {
@ -371,14 +351,16 @@ time2str(struct kinfo_proc *kp)
* fix this, but it is not 100% trivial (and interrupt
* time fractions only work on the sparc anyway). XXX
*/
secs = p->p_rtime.tv_sec;
psecs = p->p_rtime.tv_usec;
/* if (sumrusage) {
secs = kp->p_rtime_sec;
psecs = kp->p_rtime_usec;
#if 0
if (sumrusage) {
secs += k->ki_u.u_cru.ru_utime.tv_sec +
k->ki_u.u_cru.ru_stime.tv_sec;
psecs += k->ki_u.u_cru.ru_utime.tv_usec +
k->ki_u.u_cru.ru_stime.tv_usec;
} */
}
#endif
/*
* round and scale to 100's
*/
@ -386,7 +368,8 @@ time2str(struct kinfo_proc *kp)
secs += psecs / 100;
psecs = psecs % 100;
}
snprintf(timestr, sizeof(timestr), "%3ld:%02ld.%02ld", secs/60, secs%60, psecs);
snprintf(timestr, sizeof(timestr), "%3ld:%02ld.%02ld", secs/60,
secs%60, psecs);
return timestr;
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: ps.h,v 1.2 2000/06/04 16:06:26 thorpej Exp $ */
/* $NetBSD: ps.h,v 1.3 2002/05/04 18:44:27 thorpej Exp $ */
/*-
* Copyright (c) 1999
@ -36,7 +36,7 @@
extern int nproc;
extern struct p_times {
float pt_pctcpu;
struct kinfo_proc *pt_kp;
struct kinfo_proc2 *pt_kp;
} *pt;
extern u_int64_t stime[CPUSTATES];