summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_synch.c
diff options
context:
space:
mode:
authorguenther <guenther@openbsd.org>2011-12-11 19:42:28 +0000
committerguenther <guenther@openbsd.org>2011-12-11 19:42:28 +0000
commit2ea51a70232b4bd59dc6059ffd1585fd81f5b25c (patch)
tree3ae98b3a3baa568fbbc43945a6d3100c7aef7f94 /sys/kern/kern_synch.c
parentMake the mta code a bit more straightforward: (diff)
downloadwireguard-openbsd-2ea51a70232b4bd59dc6059ffd1585fd81f5b25c.tar.xz
wireguard-openbsd-2ea51a70232b4bd59dc6059ffd1585fd81f5b25c.zip
Suspend other rthreads before dumping core or execing; make them exit
when exec succeeds. ok jsing@
Diffstat (limited to 'sys/kern/kern_synch.c')
-rw-r--r--sys/kern/kern_synch.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/sys/kern/kern_synch.c b/sys/kern/kern_synch.c
index aebdfcb3c14..4b711711c02 100644
--- a/sys/kern/kern_synch.c
+++ b/sys/kern/kern_synch.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_synch.c,v 1.97 2011/07/07 18:00:33 guenther Exp $ */
+/* $OpenBSD: kern_synch.c,v 1.98 2011/12/11 19:42:28 guenther Exp $ */
/* $NetBSD: kern_synch.c,v 1.37 1996/04/22 01:38:37 christos Exp $ */
/*
@@ -282,7 +282,7 @@ sleep_setup_signal(struct sleep_state *sls, int prio)
* stopped, p->p_wchan will be 0 upon return from CURSIG.
*/
atomic_setbits_int(&p->p_flag, P_SINTR);
- if ((sls->sls_sig = CURSIG(p)) != 0) {
+ if (p->p_p->ps_single != NULL || (sls->sls_sig = CURSIG(p)) != 0) {
if (p->p_wchan)
unsleep(p);
p->p_stat = SONPROC;
@@ -297,8 +297,11 @@ int
sleep_finish_signal(struct sleep_state *sls)
{
struct proc *p = curproc;
+ int error;
if (sls->sls_catch != 0) {
+ if ((error = single_thread_check(p, 1)))
+ return (error);
if (sls->sls_sig != 0 || (sls->sls_sig = CURSIG(p)) != 0) {
if (p->p_sigacts->ps_sigintr & sigmask(sls->sls_sig))
return (EINTR);