If process() failed and the signal remains in the queue, the most
possible reason is that the target thread already armed by another
signal and do 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 <christian.fra...@t-online.de>
Reviewed-by:
Signed-off-by: Takashi Yano <takashi.y...@nifty.ne.jp>
---
 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 4c557f048..7e02e61f7 100644
--- a/winsup/cygwin/sigproc.cc
+++ b/winsup/cygwin/sigproc.cc
@@ -1342,7 +1342,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)
-- 
2.45.1

Reply via email to