Fix another process stuck-during-exit bug - stuck due to signal.
authorMatthew Dillon <dillon@apollo.backplane.com>
Sun, 25 Jan 2009 07:13:46 +0000 (23:13 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Sun, 25 Jan 2009 07:13:46 +0000 (23:13 -0800)
Fix a bug where an exiting process becomes a zombie, entering the SZOMB
state, but then receives a stop signal before it can be reaped.  If this
occurs the process was incorrectly placed in SSTOP and then later made
SACTIVE again, preventing it from being reaped.

Symptoms were: process shows up in ps in a DEL state but does not show
up in kgdb's 'info thread' list.  Process is the zombie list and is still
a child of init, but it's state is SACTIVE instead of SZOMB and p_xstat
(last signal taken) is SIGSTOP or SIGTSTP.

sys/kern/kern_sig.c

index 732890f..b28e66f 100644 (file)
@@ -1277,7 +1277,7 @@ proc_stop(struct proc *p)
        struct lwp *lp;
 
        /* If somebody raced us, be happy with it */
-       if (p->p_stat == SSTOP)
+       if (p->p_stat == SSTOP || p->p_stat == SZOMB)
                return;
 
        crit_enter();