summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_sig.c
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 /sys/kern/kern_sig.c
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
Diffstat (limited to 'sys/kern/kern_sig.c')
-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