Index: sys/kern/kern_sig.c =================================================================== RCS file: /home/ncvs/src/sys/kern/kern_sig.c,v retrieving revision 1.318 diff -u -r1.318 kern_sig.c --- sys/kern/kern_sig.c 9 Dec 2005 08:29:29 -0000 1.318 +++ sys/kern/kern_sig.c 21 Dec 2005 08:29:43 -0000 @@ -2272,7 +2272,6 @@ goto out; p->p_flag |= P_STOPPED_SIG; p->p_xstat = sig; - p->p_xthread = td; mtx_lock_spin(&sched_lock); FOREACH_THREAD_IN_PROC(p, td0) { if (TD_IS_SLEEPING(td0) && @@ -2599,7 +2598,6 @@ &p->p_mtx.mtx_object, "Catching SIGSTOP"); p->p_flag |= P_STOPPED_SIG; p->p_xstat = sig; - p->p_xthread = td; mtx_lock_spin(&sched_lock); FOREACH_THREAD_IN_PROC(p, td0) { if (TD_IS_SLEEPING(td0) && Index: sys/kern/sys_process.c =================================================================== RCS file: /home/ncvs/src/sys/kern/sys_process.c,v retrieving revision 1.133 diff -u -r1.133 sys_process.c --- sys/kern/sys_process.c 8 Nov 2005 23:28:12 -0000 1.133 +++ sys/kern/sys_process.c 21 Dec 2005 08:29:43 -0000 @@ -637,7 +637,9 @@ } /* not currently stopped */ - if (!P_SHOULDSTOP(p) || p->p_suspcount != p->p_numthreads || + if ((p->p_flag & (P_STOPPED_SIG | P_STOPPED_TRACE)) != + (P_STOPPED_SIG | P_STOPPED_TRACE) || + p->p_suspcount != p->p_numthreads || (p->p_flag & P_WAITED) == 0) { error = EBUSY; goto fail; @@ -795,8 +797,14 @@ if (proctree_locked) sx_xunlock(&proctree_lock); /* deliver or queue signal */ - if (P_SHOULDSTOP(p)) { - p->p_xstat = data; + if ((p->p_flag & P_STOPPED_TRACE) != 0) { + /* + * We check flag P_STOPPED_TRACE to see if + * it was stopped by debugger. If so, we can + * exchange signal with the threads in the + * process. + */ + KASSERT(p->p_xthread != NULL, ("NULL p_xthread")); mtx_lock_spin(&sched_lock); if (saved_pid <= PID_MAX) { p->p_xthread->td_flags &= ~TDF_XSIG; @@ -805,7 +813,12 @@ td2->td_flags &= ~TDF_XSIG; td2->td_xsig = data; } - p->p_xthread = NULL; + mtx_unlock_spin(&sched_lock); + } + p->p_xstat = data; + p->p_xthread = NULL; + if ((p->p_flag & (P_STOPPED_SIG | P_STOPPED_TRACE)) != 0) { + mtx_lock_spin(&sched_lock); if (req == PT_DETACH) { struct thread *td3; FOREACH_THREAD_IN_PROC(p, td3) @@ -818,15 +831,16 @@ */ mtx_unlock_spin(&sched_lock); thread_continued(p); - p->p_flag &= ~(P_STOPPED_TRACE|P_STOPPED_SIG); + p->p_flag &= ~(P_STOPPED_TRACE|P_STOPPED_SIG|P_WAITED); mtx_lock_spin(&sched_lock); thread_unsuspend(p); mtx_unlock_spin(&sched_lock); - } else if (data) { - psignal(p, data); } - PROC_UNLOCK(p); + if (data) + psignal(p, data); + + PROC_UNLOCK(p); return (0); case PT_WRITE_I: