diff options
author | davidxu <davidxu@FreeBSD.org> | 2003-12-07 23:47:15 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2003-12-07 23:47:15 +0000 |
commit | 69ce33ca6ec987f3fe8b8336f9dcb83f47666964 (patch) | |
tree | fe59da4eb6ce6896fda146f64f2fe8177c5155fa /sys/kern/kern_sig.c | |
parent | b0593adf64aaaedb82017c14d05e1e2f25e58601 (diff) | |
download | FreeBSD-src-69ce33ca6ec987f3fe8b8336f9dcb83f47666964.zip FreeBSD-src-69ce33ca6ec987f3fe8b8336f9dcb83f47666964.tar.gz |
Lock and unlock sched_lock when walking through thread list, current we
insert kse upcall thread into thread list at mi_switch time, process lock
is not enough.
Diffstat (limited to 'sys/kern/kern_sig.c')
-rw-r--r-- | sys/kern/kern_sig.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index 26ad4b1..d74680a 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -395,8 +395,10 @@ kern_sigaction(td, sig, act, oact, flags) } /* never to be seen again */ SIGDELSET(p->p_siglist, sig); + mtx_lock_spin(&sched_lock); FOREACH_THREAD_IN_PROC(p, td0) SIGDELSET(td0->td_siglist, sig); + mtx_unlock_spin(&sched_lock); if (sig != SIGCONT) /* easier in psignal */ SIGADDSET(ps->ps_sigignore, sig); @@ -1589,10 +1591,13 @@ sigtd(struct proc *p, int sig, int prop) * way to deliver signal. */ signal_td = NULL; + mtx_lock_spin(&sched_lock); FOREACH_THREAD_IN_PROC(p, td) { if (td->td_waitset != NULL && - SIGISMEMBER(*(td->td_waitset), sig)) + SIGISMEMBER(*(td->td_waitset), sig)) { + mtx_unlock_spin(&sched_lock); return (td); + } if (!SIGISMEMBER(td->td_sigmask, sig)) { if (td == curthread) signal_td = curthread; @@ -1602,6 +1607,7 @@ sigtd(struct proc *p, int sig, int prop) } if (signal_td == NULL) signal_td = FIRST_THREAD_IN_PROC(p); + mtx_unlock_spin(&sched_lock); return (signal_td); } @@ -1741,8 +1747,10 @@ do_tdsignal(struct thread *td, int sig, sigtarget_t target) * XXX Should investigate leaving STOP and CONT sigs only in * the proc's siglist. */ + mtx_lock_spin(&sched_lock); FOREACH_THREAD_IN_PROC(p, td0) SIG_STOPSIGMASK(td0->td_siglist); + mtx_unlock_spin(&sched_lock); } if (prop & SA_STOP) { @@ -1757,8 +1765,10 @@ do_tdsignal(struct thread *td, int sig, sigtarget_t target) (action == SIG_DFL)) return; SIG_CONTSIGMASK(p->p_siglist); + mtx_lock_spin(&sched_lock); FOREACH_THREAD_IN_PROC(p, td0) SIG_CONTSIGMASK(td0->td_siglist); + mtx_unlock_spin(&sched_lock); p->p_flag &= ~P_CONTINUED; } |