Use procstat_getprocs(3) for retrieving thread information instead of

direct sysctl calls.

MFC after:	1 month
This commit is contained in:
Mikolaj Golub 2013-04-20 07:50:59 +00:00
parent 39680c7bfb
commit efade1503b
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=249668
4 changed files with 17 additions and 66 deletions

View File

@ -77,7 +77,7 @@ procstat(struct procstat *prstat, struct kinfo_proc *kipp)
else if (sflag) else if (sflag)
procstat_cred(kipp); procstat_cred(kipp);
else if (tflag) else if (tflag)
procstat_threads(kipp); procstat_threads(prstat, kipp);
else if (vflag) else if (vflag)
procstat_vm(kipp); procstat_vm(kipp);
else if (xflag) else if (xflag)

View File

@ -44,7 +44,7 @@ void procstat_files(struct procstat *prstat, struct kinfo_proc *kipp);
void procstat_kstack(struct kinfo_proc *kipp, int kflag); void procstat_kstack(struct kinfo_proc *kipp, int kflag);
void procstat_rlimit(struct kinfo_proc *kipp); void procstat_rlimit(struct kinfo_proc *kipp);
void procstat_sigs(struct procstat *prstat, struct kinfo_proc *kipp); void procstat_sigs(struct procstat *prstat, struct kinfo_proc *kipp);
void procstat_threads(struct kinfo_proc *kipp); void procstat_threads(struct procstat *prstat, struct kinfo_proc *kipp);
void procstat_threads_sigs(struct procstat *prstat, struct kinfo_proc *kipp); void procstat_threads_sigs(struct procstat *prstat, struct kinfo_proc *kipp);
void procstat_vm(struct kinfo_proc *kipp); void procstat_vm(struct kinfo_proc *kipp);

View File

@ -86,48 +86,24 @@ procstat_sigs(struct procstat *prstat __unused, struct kinfo_proc *kipp)
} }
void void
procstat_threads_sigs(struct procstat *prstat __unused, struct kinfo_proc *kipp) procstat_threads_sigs(struct procstat *procstat, struct kinfo_proc *kipp)
{ {
struct kinfo_proc *kip; struct kinfo_proc *kip;
pid_t pid; pid_t pid;
int error, name[4], j; int j;
unsigned int i; unsigned int count, i;
size_t len;
pid = kipp->ki_pid; pid = kipp->ki_pid;
if (!hflag) if (!hflag)
printf("%5s %6s %-16s %-7s %4s\n", "PID", "TID", "COMM", printf("%5s %6s %-16s %-7s %4s\n", "PID", "TID", "COMM",
"SIG", "FLAGS"); "SIG", "FLAGS");
/* kip = procstat_getprocs(procstat, KERN_PROC_PID | KERN_PROC_INC_THREAD,
* We need to re-query for thread information, so don't use *kipp. pid, &count);
*/
name[0] = CTL_KERN;
name[1] = KERN_PROC;
name[2] = KERN_PROC_PID | KERN_PROC_INC_THREAD;
name[3] = pid;
len = 0;
error = sysctl(name, 4, NULL, &len, NULL, 0);
if (error < 0 && errno != ESRCH) {
warn("sysctl: kern.proc.pid: %d", pid);
return;
}
if (error < 0)
return;
kip = malloc(len);
if (kip == NULL) if (kip == NULL)
err(-1, "malloc");
if (sysctl(name, 4, kip, &len, NULL, 0) < 0) {
warn("sysctl: kern.proc.pid: %d", pid);
free(kip);
return; return;
} kinfo_proc_sort(kip, count);
for (i = 0; i < count; i++) {
kinfo_proc_sort(kip, len / sizeof(*kipp));
for (i = 0; i < len / sizeof(*kipp); i++) {
kipp = &kip[i]; kipp = &kip[i];
for (j = 1; j <= _SIG_MAXSIG; j++) { for (j = 1; j <= _SIG_MAXSIG; j++) {
printf("%5d ", pid); printf("%5d ", pid);
@ -140,5 +116,5 @@ procstat_threads_sigs(struct procstat *prstat __unused, struct kinfo_proc *kipp)
printf("\n"); printf("\n");
} }
} }
free(kip); procstat_freeprocs(procstat, kip);
} }

View File

@ -40,47 +40,22 @@
#include "procstat.h" #include "procstat.h"
void void
procstat_threads(struct kinfo_proc *kipp) procstat_threads(struct procstat *procstat, struct kinfo_proc *kipp)
{ {
struct kinfo_proc *kip; struct kinfo_proc *kip;
int error, name[4]; unsigned int count, i;
unsigned int i;
const char *str; const char *str;
size_t len;
if (!hflag) if (!hflag)
printf("%5s %6s %-16s %-16s %2s %4s %-7s %-9s\n", "PID", printf("%5s %6s %-16s %-16s %2s %4s %-7s %-9s\n", "PID",
"TID", "COMM", "TDNAME", "CPU", "PRI", "STATE", "WCHAN"); "TID", "COMM", "TDNAME", "CPU", "PRI", "STATE", "WCHAN");
/* kip = procstat_getprocs(procstat, KERN_PROC_PID | KERN_PROC_INC_THREAD,
* We need to re-query for thread information, so don't use *kipp. kipp->ki_pid, &count);
*/
name[0] = CTL_KERN;
name[1] = KERN_PROC;
name[2] = KERN_PROC_PID | KERN_PROC_INC_THREAD;
name[3] = kipp->ki_pid;
len = 0;
error = sysctl(name, 4, NULL, &len, NULL, 0);
if (error < 0 && errno != ESRCH) {
warn("sysctl: kern.proc.pid: %d", kipp->ki_pid);
return;
}
if (error < 0)
return;
kip = malloc(len);
if (kip == NULL) if (kip == NULL)
err(-1, "malloc");
if (sysctl(name, 4, kip, &len, NULL, 0) < 0) {
warn("sysctl: kern.proc.pid: %d", kipp->ki_pid);
free(kip);
return; return;
} kinfo_proc_sort(kip, count);
for (i = 0; i < count; i++) {
kinfo_proc_sort(kip, len / sizeof(*kipp));
for (i = 0; i < len / sizeof(*kipp); i++) {
kipp = &kip[i]; kipp = &kip[i];
printf("%5d ", kipp->ki_pid); printf("%5d ", kipp->ki_pid);
printf("%6d ", kipp->ki_tid); printf("%6d ", kipp->ki_tid);
@ -139,5 +114,5 @@ procstat_threads(struct kinfo_proc *kipp)
} }
printf("\n"); printf("\n");
} }
free(kip); procstat_freeprocs(procstat, kip);
} }