Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/kern_exit.c
Show First 20 Lines • Show All 441 Lines • ▼ Show 20 Lines | #endif | ||||
* The address space is released by "vmspace_exitfree(p)" in | * The address space is released by "vmspace_exitfree(p)" in | ||||
* vm_waitproc(). | * vm_waitproc(). | ||||
*/ | */ | ||||
cpu_exit(td); | cpu_exit(td); | ||||
WITNESS_WARN(WARN_PANIC, NULL, "process (pid %d) exiting", p->p_pid); | WITNESS_WARN(WARN_PANIC, NULL, "process (pid %d) exiting", p->p_pid); | ||||
/* | /* | ||||
* Move proc from allproc queue to zombproc. | * Remove from allproc. It still sits in the hash. | ||||
*/ | */ | ||||
sx_xlock(&allproc_lock); | sx_xlock(&allproc_lock); | ||||
sx_xlock(&zombproc_lock); | |||||
LIST_REMOVE(p, p_list); | LIST_REMOVE(p, p_list); | ||||
LIST_INSERT_HEAD(&zombproc, p, p_list); | |||||
sx_xunlock(&zombproc_lock); | |||||
sx_xunlock(&allproc_lock); | sx_xunlock(&allproc_lock); | ||||
sx_xlock(&proctree_lock); | sx_xlock(&proctree_lock); | ||||
PROC_LOCK(p); | PROC_LOCK(p); | ||||
p->p_flag &= ~(P_TRACED | P_PPWAIT | P_PPTRACE); | p->p_flag &= ~(P_TRACED | P_PPWAIT | P_PPTRACE); | ||||
PROC_UNLOCK(p); | PROC_UNLOCK(p); | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 433 Lines • ▼ Show 20 Lines | if (p->p_oppid != p->p_pptr->p_pid) { | ||||
return; | return; | ||||
} | } | ||||
PROC_UNLOCK(p); | PROC_UNLOCK(p); | ||||
/* | /* | ||||
* Remove other references to this process to ensure we have an | * Remove other references to this process to ensure we have an | ||||
* exclusive reference. | * exclusive reference. | ||||
*/ | */ | ||||
sx_xlock(&zombproc_lock); | |||||
LIST_REMOVE(p, p_list); /* off zombproc */ | |||||
sx_xunlock(&zombproc_lock); | |||||
sx_xlock(PIDHASHLOCK(p->p_pid)); | sx_xlock(PIDHASHLOCK(p->p_pid)); | ||||
LIST_REMOVE(p, p_hash); | LIST_REMOVE(p, p_hash); | ||||
sx_xunlock(PIDHASHLOCK(p->p_pid)); | sx_xunlock(PIDHASHLOCK(p->p_pid)); | ||||
LIST_REMOVE(p, p_sibling); | LIST_REMOVE(p, p_sibling); | ||||
reaper_abandon_children(p, true); | reaper_abandon_children(p, true); | ||||
reaper_clear(p); | reaper_clear(p); | ||||
proc_id_clear(PROC_ID_PID, p->p_pid); | proc_id_clear(PROC_ID_PID, p->p_pid); | ||||
PROC_LOCK(p); | PROC_LOCK(p); | ||||
▲ Show 20 Lines • Show All 487 Lines • Show Last 20 Lines |