Use procstat_getprocs(3) for retrieving thread information instead of
direct sysctl calls. MFC after: 1 month
This commit is contained in:
parent
39680c7bfb
commit
efade1503b
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=249668
@ -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)
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user