From: Markus Armbruster Date: Sun, 27 Dec 2020 08:30:00 +0000 (+0100) Subject: lwp: Fix signal wait screwup for multiple different signals X-Git-Url: http://git.pond.sub.org/?p=empserver;a=commitdiff_plain;h=bfb558dee35875037fdea18a6c7ae2c4a97bec13 lwp: Fix signal wait screwup for multiple different signals lwpSigWait() clears LwpSigCheck even when signals remain in LwpSigCaught. The next empth_wait_for_signal() will then wait until another one gets caught. Broken in commit fe2de3d74, v4.3.10. Fix by clearing it only when LwpSigCaught is empty. Signed-off-by: Markus Armbruster --- diff --git a/src/lib/lwp/sig.c b/src/lib/lwp/sig.c index 04fb9f977..62d19728a 100644 --- a/src/lib/lwp/sig.c +++ b/src/lib/lwp/sig.c @@ -91,9 +91,10 @@ static int lwpGetSig(sigset_t *set) { sigset_t save; - int i; + int i, j; sigprocmask(SIG_BLOCK, set, &save); + for (i = NSIG - 1; i > 0; i--) { if (sigismember(set, i) > 0 && sigismember(&LwpSigCaught, i) > 0) { lwpStatus(LwpCurrent, "Got awaited signal %d", i); @@ -101,6 +102,14 @@ lwpGetSig(sigset_t *set) break; } } + + for (j = i; + sigismember(set, i) > 0 && sigismember(&LwpSigCaught, i) > 0; + j--) + ; + if (!j) + LwpSigCheck = 0; + sigprocmask(SIG_SETMASK, &save, NULL); return i; } @@ -119,7 +128,6 @@ lwpSigWait(sigset_t *set, int *sig) if (LwpSigWaiter) return EBUSY; for (;;) { - LwpSigCheck = 0; res = lwpGetSig(set); if (res > 0) break;