From: bluhm Date: Wed, 18 Jul 2018 16:55:17 +0000 (+0000) Subject: Revert the change that delivers process signals to any threads. As X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=3df37035a6433c7d8dacdece03b3dc603fda2737;p=openbsd Revert the change that delivers process signals to any threads. As side effect pending signals specifically sent to the main thread were handled by other threads. This made gcj in textproc/pdftk port build stall. Noticed and tested by espie@. --- diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index 7a8a7a9ac69..72f58166b67 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_sig.c,v 1.222 2018/07/11 19:28:16 bluhm Exp $ */ +/* $OpenBSD: kern_sig.c,v 1.223 2018/07/18 16:55:17 bluhm Exp $ */ /* $NetBSD: kern_sig.c,v 1.54 1996/04/22 01:38:32 christos Exp $ */ /* @@ -1153,17 +1153,14 @@ issignal(struct proc *p) int s; for (;;) { - mask = SIGPENDING(p); + mask = p->p_siglist & ~p->p_sigmask; if (pr->ps_flags & PS_PPWAIT) mask &= ~stopsigmask; if (mask == 0) /* no signal to send */ return (0); signum = ffs((long)mask); mask = sigmask(signum); - if (p->p_siglist & mask) - atomic_clearbits_int(&p->p_siglist, mask); - else - atomic_clearbits_int(&pr->ps_mainproc->p_siglist, mask); + atomic_clearbits_int(&p->p_siglist, mask); /* * We should see pending but ignored signals @@ -1839,7 +1836,7 @@ userret(struct proc *p) KERNEL_UNLOCK(); } - if (SIGPENDING(p) != 0) { + if (SIGPENDING(p)) { KERNEL_LOCK(); while ((signum = CURSIG(p)) != 0) postsig(p, signum); diff --git a/sys/sys/signalvar.h b/sys/sys/signalvar.h index f5e0a07cb88..91404ebd671 100644 --- a/sys/sys/signalvar.h +++ b/sys/sys/signalvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: signalvar.h,v 1.32 2018/07/11 19:28:16 bluhm Exp $ */ +/* $OpenBSD: signalvar.h,v 1.33 2018/07/18 16:55:17 bluhm Exp $ */ /* $NetBSD: signalvar.h,v 1.17 1996/04/22 01:23:31 christos Exp $ */ /* @@ -68,9 +68,7 @@ struct sigacts { /* * Check if process p has an unmasked signal pending. */ -#define SIGPENDING(p) \ - (((p)->p_siglist | (p)->p_p->ps_mainproc->p_siglist) & \ - ~(p)->p_sigmask) +#define SIGPENDING(p) (((p)->p_siglist & ~(p)->p_sigmask) != 0) /* * Determine signal that should be delivered to process p, the current @@ -78,9 +76,10 @@ struct sigacts { * action, the process stops in issignal(). */ #define CURSIG(p) \ - (((((p)->p_siglist | (p)->p_p->ps_mainproc->p_siglist) == 0) || \ - (((p)->p_p->ps_flags & PS_TRACED) == 0 && SIGPENDING(p) == 0)) \ - ? 0 : issignal(p)) + (((p)->p_siglist == 0 || \ + (((p)->p_p->ps_flags & PS_TRACED) == 0 && \ + ((p)->p_siglist & ~(p)->p_sigmask) == 0)) ? \ + 0 : issignal(p)) /* * Clear a pending signal from a process.