summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2004-01-08 22:44:54 +0000
committerrwatson <rwatson@FreeBSD.org>2004-01-08 22:44:54 +0000
commitbefa7a41a2066d28b744f83557cdec32fe3fe9f2 (patch)
treeabc18c56335163ce077038490574df6710ea1a91
parent142640c5deafc861062095c3a0e91148d11b0a17 (diff)
downloadFreeBSD-src-befa7a41a2066d28b744f83557cdec32fe3fe9f2.zip
FreeBSD-src-befa7a41a2066d28b744f83557cdec32fe3fe9f2.tar.gz
Drop the sigacts mutex around calls to stopevent() to avoid sleeping
holding the mutex. Because the sigacts pointer can't change while the process is "live" (proc locking (x)), we know our pointer is still valid. In communication with: truckman Reviewed by: jhb
-rw-r--r--sys/kern/kern_sig.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c
index 7ad7dcc..bf822d1 100644
--- a/sys/kern/kern_sig.c
+++ b/sys/kern/kern_sig.c
@@ -2080,7 +2080,11 @@ issignal(td)
return (0);
sig = sig_ffs(&sigpending);
- _STOPEVENT(p, S_SIG, sig);
+ if (p->p_stops & S_SIG) {
+ mtx_unlock(&ps->ps_mtx);
+ stopevent(p, S_SIG, sig);
+ mtx_lock(&ps->ps_mtx);
+ }
/*
* We should see pending but ignored signals
@@ -2296,7 +2300,11 @@ postsig(sig)
ktrpsig(sig, action, td->td_pflags & TDP_OLDMASK ?
&td->td_oldsigmask : &td->td_sigmask, 0);
#endif
- _STOPEVENT(p, S_SIG, sig);
+ if (p->p_stops & S_SIG) {
+ mtx_unlock(&ps->ps_mtx);
+ stopevent(p, S_SIG, sig);
+ mtx_lock(&ps->ps_mtx);
+ }
if (!(td->td_flags & TDF_SA && td->td_mailbox) &&
action == SIG_DFL) {
OpenPOWER on IntegriCloud