diff options
author | julian <julian@FreeBSD.org> | 2002-06-30 07:50:22 +0000 |
---|---|---|
committer | julian <julian@FreeBSD.org> | 2002-06-30 07:50:22 +0000 |
commit | e88eb0a6e9c31e326748ae46bf69ee72fa1ce16c (patch) | |
tree | bd4b50484e772aac6e613d77c8305d8db11cb849 /sys | |
parent | 437dcf4e4331f1e9a6a091a46fcc8b136c257b01 (diff) | |
download | FreeBSD-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')
-rw-r--r-- | sys/kern/kern_proc.c | 108 |
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); |