* sigproc.cc (wait_sig): Ensure that waiting threads are awoken after returning

from a hold condition.
This commit is contained in:
Christopher Faylor 2004-09-12 19:34:08 +00:00
parent 3d65bb97e8
commit a5eb75d60c
2 changed files with 21 additions and 8 deletions

View File

@ -1,3 +1,8 @@
2004-09-12 Christopher Faylor <cgf@timesys.com>
* sigproc.cc (wait_sig): Ensure that waiting threads are awoken after
returning from a hold condition.
2004-09-12 Christopher Faylor <cgf@timesys.com>
* child_info.h (CURR_CHILD_INFO_MAGIC): Update.

View File

@ -1139,6 +1139,7 @@ wait_sig (VOID *self)
}
sigpacket *q;
bool clearwait = false;
switch (pack.si.si_signo)
{
case __SIGCOMMUNE:
@ -1155,18 +1156,23 @@ wait_sig (VOID *self)
if (myself->getsigmask () & (bit = SIGTOMASK (q->si.si_signo)))
*pack.mask |= bit;
break;
case __SIGFLUSH:
case __SIGFLUSHFAST:
sigq.reset ();
while ((q = sigq.next ()))
if (q->si.si_signo == __SIGDELETE || q->process () > 0)
sigq.del ();
break;
case __SIGHOLD:
holding_signals = 1;
break;
case __SIGNOHOLD:
holding_signals = 0;
/* fall through, intentionally */
case __SIGFLUSH:
case __SIGFLUSHFAST:
sigq.reset ();
while ((q = sigq.next ()))
{
int sig = q->si.si_signo;
if (sig == __SIGDELETE || q->process () > 0)
sigq.del ();
if (sig == __SIGNOHOLD && q->si.si_signo == SIGCHLD)
clearwait = true;
}
break;
default:
if (pack.si.si_signo < 0)
@ -1191,10 +1197,12 @@ wait_sig (VOID *self)
}
}
if (sig == SIGCHLD)
proc_subproc (PROC_CLEARWAIT, 0);
clearwait = true;
}
break;
}
if (clearwait)
proc_subproc (PROC_CLEARWAIT, 0);
if (pack.wakeup)
{
SetEvent (pack.wakeup);