From c48d58d838d90df6247123c487686699742d75de Mon Sep 17 00:00:00 2001 From: Takashi Yano Date: Tue, 3 Dec 2024 22:14:44 +0900 Subject: [PATCH] Cygwin: signal: Increase chance of handling signal in main thread If the process() fails and the signal remains in the queue, the most possible reason is that the target thread is already armed by another signal and does not handle it yet. With this patch, to increase the chance of handling it in the other threads, call yield() before retrying process(). Addresses: https://cygwin.com/pipermail/cygwin/2024-November/256744.html Fixes: e10f822a2b39 ("Cygwin: signal: Handle queued signal without explicit __SIGFLUSH") Reported-by: Christian Franke Reviewed-by: Signed-off-by: Takashi Yano --- winsup/cygwin/sigproc.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index c74596f31..9680f6968 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -1325,7 +1325,10 @@ wait_sig (VOID *) pack.si.si_signo = __SIGFLUSH; else if (sigq.start.next && PeekNamedPipe (my_readsig, NULL, 0, NULL, &nb, NULL) && !nb) - pack.si.si_signo = __SIGFLUSH; + { + yield (); + 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)