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:
parent
7481482656
commit
bfb558dee3
1 changed files with 10 additions and 2 deletions
|
@ -91,9 +91,10 @@ static int
|
||||||
lwpGetSig(sigset_t *set)
|
lwpGetSig(sigset_t *set)
|
||||||
{
|
{
|
||||||
sigset_t save;
|
sigset_t save;
|
||||||
int i;
|
int i, j;
|
||||||
|
|
||||||
sigprocmask(SIG_BLOCK, set, &save);
|
sigprocmask(SIG_BLOCK, set, &save);
|
||||||
|
|
||||||
for (i = NSIG - 1; i > 0; i--) {
|
for (i = NSIG - 1; i > 0; i--) {
|
||||||
if (sigismember(set, i) > 0 && sigismember(&LwpSigCaught, i) > 0) {
|
if (sigismember(set, i) > 0 && sigismember(&LwpSigCaught, i) > 0) {
|
||||||
lwpStatus(LwpCurrent, "Got awaited signal %d", i);
|
lwpStatus(LwpCurrent, "Got awaited signal %d", i);
|
||||||
|
@ -101,6 +102,14 @@ lwpGetSig(sigset_t *set)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (j = i;
|
||||||
|
sigismember(set, i) > 0 && sigismember(&LwpSigCaught, i) > 0;
|
||||||
|
j--)
|
||||||
|
;
|
||||||
|
if (!j)
|
||||||
|
LwpSigCheck = 0;
|
||||||
|
|
||||||
sigprocmask(SIG_SETMASK, &save, NULL);
|
sigprocmask(SIG_SETMASK, &save, NULL);
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
@ -119,7 +128,6 @@ lwpSigWait(sigset_t *set, int *sig)
|
||||||
if (LwpSigWaiter)
|
if (LwpSigWaiter)
|
||||||
return EBUSY;
|
return EBUSY;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
LwpSigCheck = 0;
|
|
||||||
res = lwpGetSig(set);
|
res = lwpGetSig(set);
|
||||||
if (res > 0)
|
if (res > 0)
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue