summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_proc.c
diff options
context:
space:
mode:
authorjulian <julian@FreeBSD.org>2002-06-30 07:50:22 +0000
committerjulian <julian@FreeBSD.org>2002-06-30 07:50:22 +0000
commite88eb0a6e9c31e326748ae46bf69ee72fa1ce16c (patch)
treebd4b50484e772aac6e613d77c8305d8db11cb849 /sys/kern/kern_proc.c
parent437dcf4e4331f1e9a6a091a46fcc8b136c257b01 (diff)
downloadFreeBSD-src-e88eb0a6e9c31e326748ae46bf69ee72fa1ce16c.zip
FreeBSD-src-e88eb0a6e9c31e326748ae46bf69ee72fa1ce16c.tar.gz
If the process is a zombie, then you must not try dereference the thread
because there isn't one. Of course this code only possibly works for single threaded processes anyhow..
Diffstat (limited to 'sys/kern/kern_proc.c')
-rw-r--r--sys/kern/kern_proc.c108
1 files changed, 55 insertions, 53 deletions
diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c
index 8b15fc2..0ddad93 100644
--- a/sys/kern/kern_proc.c
+++ b/sys/kern/kern_proc.c
@@ -737,65 +737,67 @@ fill_kinfo_proc(p, kp)
kp->ki_childtime.tv_usec = p->p_stats->p_cru.ru_utime.tv_usec +
p->p_stats->p_cru.ru_stime.tv_usec;
}
- td = FIRST_THREAD_IN_PROC(p);
- if (!(p->p_flag & P_KSES)) {
- if (td->td_wmesg != NULL) {
- strncpy(kp->ki_wmesg, td->td_wmesg,
- sizeof(kp->ki_wmesg) - 1);
- }
- if (td->td_state == TDS_MTX) {
- kp->ki_kiflag |= KI_MTXBLOCK;
- strncpy(kp->ki_mtxname, td->td_mtxname,
- sizeof(kp->ki_mtxname) - 1);
+ if (p->p_state != PRS_ZOMBIE) {
+ td = FIRST_THREAD_IN_PROC(p);
+ if (!(p->p_flag & P_KSES)) {
+ if (td->td_wmesg != NULL) {
+ strncpy(kp->ki_wmesg, td->td_wmesg,
+ sizeof(kp->ki_wmesg) - 1);
+ }
+ if (td->td_state == TDS_MTX) {
+ kp->ki_kiflag |= KI_MTXBLOCK;
+ strncpy(kp->ki_mtxname, td->td_mtxname,
+ sizeof(kp->ki_mtxname) - 1);
+ }
}
- }
- if (p->p_state == PRS_NORMAL) { /* XXXKSE very aproximate */
- if ((td->td_state == TDS_RUNQ) ||
- (td->td_state == TDS_RUNNING)) {
- kp->ki_stat = SRUN;
- } else if (td->td_state == TDS_SLP) {
- kp->ki_stat = SSLEEP;
- } else if (P_SHOULDSTOP(p)) {
- kp->ki_stat = SSTOP;
- } else if (td->td_state == TDS_MTX) {
- kp->ki_stat = SMTX;
+ if (p->p_state == PRS_NORMAL) { /* XXXKSE very aproximate */
+ if ((td->td_state == TDS_RUNQ) ||
+ (td->td_state == TDS_RUNNING)) {
+ kp->ki_stat = SRUN;
+ } else if (td->td_state == TDS_SLP) {
+ kp->ki_stat = SSLEEP;
+ } else if (P_SHOULDSTOP(p)) {
+ kp->ki_stat = SSTOP;
+ } else if (td->td_state == TDS_MTX) {
+ kp->ki_stat = SMTX;
+ } else {
+ kp->ki_stat = SWAIT;
+ }
} else {
- kp->ki_stat = SWAIT;
+ kp->ki_stat = SIDL;
}
- } else if (p->p_state == PRS_ZOMBIE) {
- kp->ki_stat = SZOMB;
- } else {
- kp->ki_stat = SIDL;
- }
- kp->ki_sflag = p->p_sflag;
- kp->ki_swtime = p->p_swtime;
- kp->ki_pid = p->p_pid;
- /* vvv XXXKSE */
- if (!(p->p_flag & P_KSES)) {
- bintime2timeval(&p->p_runtime, &tv);
- kp->ki_runtime = tv.tv_sec * (u_int64_t)1000000 + tv.tv_usec;
- kp->ki_pctcpu = p->p_kse.ke_pctcpu;
- kp->ki_estcpu = p->p_ksegrp.kg_estcpu;
- kp->ki_slptime = p->p_ksegrp.kg_slptime;
- kp->ki_wchan = td->td_wchan;
- kp->ki_pri.pri_level = td->td_priority;
- kp->ki_pri.pri_user = p->p_ksegrp.kg_user_pri;
- kp->ki_pri.pri_class = p->p_ksegrp.kg_pri_class;
- kp->ki_pri.pri_native = td->td_base_pri;
- kp->ki_nice = p->p_ksegrp.kg_nice;
- kp->ki_rqindex = p->p_kse.ke_rqindex;
- kp->ki_oncpu = p->p_kse.ke_oncpu;
- kp->ki_lastcpu = td->td_lastcpu;
- kp->ki_tdflags = td->td_flags;
- kp->ki_pcb = td->td_pcb;
- kp->ki_kstack = (void *)td->td_kstack;
+ kp->ki_sflag = p->p_sflag;
+ kp->ki_swtime = p->p_swtime;
+ kp->ki_pid = p->p_pid;
+ /* vvv XXXKSE */
+ if (!(p->p_flag & P_KSES)) {
+ bintime2timeval(&p->p_runtime, &tv);
+ kp->ki_runtime = tv.tv_sec * (u_int64_t)1000000 + tv.tv_usec;
+ kp->ki_pctcpu = p->p_kse.ke_pctcpu;
+ kp->ki_estcpu = p->p_ksegrp.kg_estcpu;
+ kp->ki_slptime = p->p_ksegrp.kg_slptime;
+ kp->ki_wchan = td->td_wchan;
+ kp->ki_pri.pri_level = td->td_priority;
+ kp->ki_pri.pri_user = p->p_ksegrp.kg_user_pri;
+ kp->ki_pri.pri_class = p->p_ksegrp.kg_pri_class;
+ kp->ki_pri.pri_native = td->td_base_pri;
+ kp->ki_nice = p->p_ksegrp.kg_nice;
+ kp->ki_rqindex = p->p_kse.ke_rqindex;
+ kp->ki_oncpu = p->p_kse.ke_oncpu;
+ kp->ki_lastcpu = td->td_lastcpu;
+ kp->ki_tdflags = td->td_flags;
+ kp->ki_pcb = td->td_pcb;
+ kp->ki_kstack = (void *)td->td_kstack;
+ } else {
+ kp->ki_oncpu = -1;
+ kp->ki_lastcpu = -1;
+ kp->ki_tdflags = -1;
+ /* All the reast are 0 */
+ }
} else {
- kp->ki_oncpu = -1;
- kp->ki_lastcpu = -1;
- kp->ki_tdflags = -1;
- /* All the reast are 0 */
+ kp->ki_stat = SZOMB;
}
/* ^^^ XXXKSE */
mtx_unlock_spin(&sched_lock);
OpenPOWER on IntegriCloud