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>
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);
break;
}
}
+
+ for (j = i;
+ sigismember(set, i) > 0 && sigismember(&LwpSigCaught, i) > 0;
+ j--)
+ ;
+ if (!j)
+ LwpSigCheck = 0;
+
sigprocmask(SIG_SETMASK, &save, NULL);
return i;
}
if (LwpSigWaiter)
return EBUSY;
for (;;) {
- LwpSigCheck = 0;
res = lwpGetSig(set);
if (res > 0)
break;