diff options
-rw-r--r-- | sys/kern/kern_exit.c | 6 | ||||
-rw-r--r-- | sys/kern/kern_kthread.c | 12 |
2 files changed, 12 insertions, 6 deletions
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index 8feb178..b907981 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -508,12 +508,6 @@ retry: psignal(p->p_pptr, p->p_sigparent); } PROC_UNLOCK(p->p_pptr); - - /* - * If this is a kthread, then wakeup anyone waiting for it to exit. - */ - if (p->p_flag & P_KTHREAD) - wakeup(p); PROC_UNLOCK(p); /* diff --git a/sys/kern/kern_kthread.c b/sys/kern/kern_kthread.c index e5a0629..bce38c1 100644 --- a/sys/kern/kern_kthread.c +++ b/sys/kern/kern_kthread.c @@ -129,11 +129,23 @@ kthread_exit(int ecode) td = curthread; p = td->td_proc; + + /* + * Reparent curthread from proc0 to init so that the zombie + * is harvested. + */ sx_xlock(&proctree_lock); PROC_LOCK(p); proc_reparent(p, initproc); PROC_UNLOCK(p); sx_xunlock(&proctree_lock); + + /* + * Wakeup anyone waiting for us to exit. + */ + wakeup(p); + + /* Buh-bye! */ exit1(td, W_EXITCODE(ecode, 0)); } |