summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorjulian <julian@FreeBSD.org>2002-06-30 08:11:30 +0000
committerjulian <julian@FreeBSD.org>2002-06-30 08:11:30 +0000
commit6f349b9e5084b093f3716d5d7b2b24e58ab64c30 (patch)
tree527c78fdbd03676e65e71607f2505539c4bd6d32 /lib
parentbcd9cd0d4edce72369fe7a3c8829a7eb74604fb1 (diff)
downloadFreeBSD-src-6f349b9e5084b093f3716d5d7b2b24e58ab64c30.zip
FreeBSD-src-6f349b9e5084b093f3716d5d7b2b24e58ab64c30.tar.gz
Don't follow non existant thread pointers (e.g. for zombies)
Diffstat (limited to 'lib')
-rw-r--r--lib/libkvm/kvm_proc.c68
1 files changed, 35 insertions, 33 deletions
diff --git a/lib/libkvm/kvm_proc.c b/lib/libkvm/kvm_proc.c
index 547792e..5bc1867 100644
--- a/lib/libkvm/kvm_proc.c
+++ b/lib/libkvm/kvm_proc.c
@@ -268,7 +268,7 @@ kvm_proclist(kd, what, arg, p, bp, maxcnt)
nopgrp:
kp->ki_tdev = NODEV;
}
- if (mainthread.td_wmesg) /* XXXKSE */
+ if (mainthread && mainthread.td_wmesg) /* XXXKSE */
(void)kvm_read(kd, (u_long)mainthread.td_wmesg,
kp->ki_wmesg, WMESGLEN);
@@ -307,7 +307,7 @@ nopgrp:
strncpy(kp->ki_comm, proc.p_comm, MAXCOMLEN);
kp->ki_comm[MAXCOMLEN] = 0;
}
- if (mainthread.td_blocked != 0) { /* XXXKSE */
+ if (mainthread && mainthread.td_blocked != 0) { /* XXXKSE */
kp->ki_kiflag |= KI_MTXBLOCK;
if (mainthread.td_mtxname) /* XXXKSE */
(void)kvm_read(kd, (u_long)mainthread.td_mtxname,
@@ -321,41 +321,43 @@ nopgrp:
kp->ki_sigmask = proc.p_sigmask;
kp->ki_xstat = proc.p_xstat;
kp->ki_acflag = proc.p_acflag;
- kp->ki_pctcpu = proc.p_kse.ke_pctcpu; /* XXXKSE */
- kp->ki_estcpu = proc.p_ksegrp.kg_estcpu; /* XXXKSE */
- kp->ki_slptime = proc.p_kse.ke_slptime; /* XXXKSE */
- kp->ki_swtime = proc.p_swtime;
- kp->ki_flag = proc.p_flag; /* WILDLY INNACURATE XXXKSE */
- kp->ki_sflag = proc.p_sflag;
- kp->ki_wchan = mainthread.td_wchan; /* XXXKSE */
- kp->ki_traceflag = proc.p_traceflag;
- if (proc.p_state == PRS_NORMAL) { /* XXXKSE very aproximate */
- if ((mainthread.td_state == TDS_RUNQ) ||
- (mainthread.td_state == TDS_RUNNING)) {
- kp->ki_stat = SRUN;
- } else if (mainthread.td_state == TDS_SLP) {
- kp->ki_stat = SSLEEP;
- } else if (P_SHOULDSTOP(&proc)) {
- kp->ki_stat = SSTOP;
- } else if (mainthread.td_state == TDS_MTX) {
- kp->ki_stat = SMTX;
+ if (mainthread) {
+ kp->ki_pctcpu = proc.p_kse.ke_pctcpu;
+ kp->ki_estcpu = proc.p_ksegrp.kg_estcpu;
+ kp->ki_slptime = proc.p_kse.ke_slptime;
+ kp->ki_swtime = proc.p_swtime;
+ kp->ki_flag = proc.p_flag;
+ kp->ki_sflag = proc.p_sflag;
+ kp->ki_wchan = mainthread.td_wchan;
+ kp->ki_traceflag = proc.p_traceflag;
+ if (proc.p_state == PRS_NORMAL) {
+ if ((mainthread.td_state == TDS_RUNQ) ||
+ (mainthread.td_state == TDS_RUNNING)) {
+ kp->ki_stat = SRUN;
+ } else if (mainthread.td_state == TDS_SLP) {
+ kp->ki_stat = SSLEEP;
+ } else if (P_SHOULDSTOP(&proc)) {
+ kp->ki_stat = SSTOP;
+ } else if (mainthread.td_state == TDS_MTX) {
+ kp->ki_stat = SMTX;
+ } else {
+ kp->ki_stat = SWAIT;
+ }
} else {
- kp->ki_stat = SWAIT;
+ kp->ki_stat = SIDL;
}
- } else if (proc.p_state == PRS_ZOMBIE) {
- kp->ki_stat = SZOMB;
+ kp->ki_pri.pri_class = proc.p_ksegrp.kg_pri_class;
+ kp->ki_pri.pri_user = proc.p_ksegrp.kg_user_pri;
+ kp->ki_pri.pri_level = mainthread.td_priority;
+ kp->ki_pri.pri_native = mainthread.td_base_pri;
+ kp->ki_nice = proc.p_ksegrp.kg_nice;
+ kp->ki_lock = proc.p_lock;
+ kp->ki_rqindex = proc.p_kse.ke_rqindex;
+ kp->ki_oncpu = proc.p_kse.ke_oncpu;
+ kp->ki_lastcpu = mainthread.td_lastcpu;
} else {
- kp->ki_stat = SIDL;
+ kp->ki_stat = SZOMB;
}
- kp->ki_pri.pri_class = proc.p_ksegrp.kg_pri_class; /* XXXKSE */
- kp->ki_pri.pri_user = proc.p_ksegrp.kg_user_pri; /* XXXKSE */
- kp->ki_pri.pri_level = mainthread.td_priority; /* XXXKSE */
- kp->ki_pri.pri_native = mainthread.td_base_pri; /* XXXKSE */
- kp->ki_nice = proc.p_ksegrp.kg_nice; /* XXXKSE */
- kp->ki_lock = proc.p_lock;
- kp->ki_rqindex = proc.p_kse.ke_rqindex; /* XXXKSE */
- kp->ki_oncpu = proc.p_kse.ke_oncpu; /* XXXKSE */
- kp->ki_lastcpu = mainthread.td_lastcpu; /* XXXKSE */
bcopy(&kinfo_proc, bp, sizeof(kinfo_proc));
++bp;
++cnt;
OpenPOWER on IntegriCloud