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 <armbru@pond.sub.org>
This commit is contained in:
Markus Armbruster 2020-12-27 09:30:00 +01:00
parent aae823507c
commit 460cc9e2ee

View file

@ -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;