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
aae823507c
commit
460cc9e2ee
1 changed files with 10 additions and 2 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue