From 2ea51a70232b4bd59dc6059ffd1585fd81f5b25c Mon Sep 17 00:00:00 2001 From: guenther Date: Sun, 11 Dec 2011 19:42:28 +0000 Subject: Suspend other rthreads before dumping core or execing; make them exit when exec succeeds. ok jsing@ --- sys/kern/kern_synch.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'sys/kern/kern_synch.c') 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); -- cgit v1.2.3-59-g8ed1b