From 4e80783e1ec7e12bd1ddb8c39e5336183850c394 Mon Sep 17 00:00:00 2001 From: cgf Date: Sun, 12 Sep 2004 19:34:07 +0000 Subject: [PATCH] * sigproc.cc (wait_sig): Ensure that waiting threads are awoken after returning from a hold condition. --- winsup/cygwin/ChangeLog | 5 +++++ winsup/cygwin/sigproc.cc | 24 ++++++++++++++++-------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index db12169981..8c0a5aac37 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,5 +1,10 @@ 2004-09-12 Christopher Faylor + * sigproc.cc (wait_sig): Ensure that waiting threads are awoken after + returning from a hold condition. + +2004-09-12 Christopher Faylor + * child_info.h (CURR_CHILD_INFO_MAGIC): Update. 2004-09-11 Pierre Humblet diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index e9fec66435..2ab97698f7 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -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); -- 2.11.0