summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2003-12-07 23:47:15 +0000
committerdavidxu <davidxu@FreeBSD.org>2003-12-07 23:47:15 +0000
commit69ce33ca6ec987f3fe8b8336f9dcb83f47666964 (patch)
treefe59da4eb6ce6896fda146f64f2fe8177c5155fa /sys
parentb0593adf64aaaedb82017c14d05e1e2f25e58601 (diff)
downloadFreeBSD-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')
-rw-r--r--sys/kern/kern_sig.c12
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;
}
OpenPOWER on IntegriCloud