aboutsummaryrefslogtreecommitdiff
path: root/winsup
diff options
context:
space:
mode:
authorTakashi Yano <takashi.yano@nifty.ne.jp>2024-11-25 20:19:06 +0900
committerTakashi Yano <takashi.yano@nifty.ne.jp>2024-11-28 20:21:45 +0900
commite10f822a2b39bade20858ba3c704a8bb7d965cb4 (patch)
tree7c8a94034fe23598198336b13ad111b43dc76a0c /winsup
parentd243e51ef1d30312ba1e21b4d25a1ca9a8dc1f63 (diff)
downloadnewlib-e10f822a2b39bade20858ba3c704a8bb7d965cb4.zip
newlib-e10f822a2b39bade20858ba3c704a8bb7d965cb4.tar.gz
newlib-e10f822a2b39bade20858ba3c704a8bb7d965cb4.tar.bz2
Cygwin: signal: Handle queued signal without explicit __SIGFLUSH
With the previous code, the queued signal is tried to resend only when a new signal arrives or pending_signals::pending() is called. With this patch, if the signal is queued and the retry flag is not set and the new signal is not received yet, the sig thread tries to handle the queued signal again. Without this patch, the chance to handle the queue would be delayed. Addresses: https://cygwin.com/pipermail/cygwin/2024-November/256744.html Fixes: 5e31c80e4e8d ("(pending_signals::pending): Force an additional loop through wait_sig by setting retry whenever this function is called.") Reported-by: Christian Franke <Christian.Franke@t-online.de> Reviewed-by: Corinna Vinschen <corinna@vinschen.de> Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/sigproc.cc3
1 files changed, 3 insertions, 0 deletions
diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc
index b67eccf..8f46a80 100644
--- a/winsup/cygwin/sigproc.cc
+++ b/winsup/cygwin/sigproc.cc
@@ -1321,6 +1321,9 @@ wait_sig (VOID *)
sigpacket pack = {};
if (sigq.retry)
pack.si.si_signo = __SIGFLUSH;
+ else if (sigq.start.next
+ && PeekNamedPipe (my_readsig, NULL, 0, NULL, &nb, NULL) && !nb)
+ pack.si.si_signo = __SIGFLUSH;
else if (!ReadFile (my_readsig, &pack, sizeof (pack), &nb, NULL))
Sleep (INFINITE); /* Assume were exiting. Never exit this thread */
else if (nb != sizeof (pack) || !pack.si.si_signo)