https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=12faeffa3c0a5f76eaaa62d11630af8b2da600f1
commit 12faeffa3c0a5f76eaaa62d11630af8b2da600f1 Author: Takashi Yano <[email protected]> Date: Tue Jan 21 00:13:04 2025 +0900 Cygwin: signal: Do not handle signal when __SIGFLUSHFAST is sent The commit a22a0ad7c4f0 was not entirely correct. Even with the patch, some hangs still occur. This patch overrides the previous commit along with the patch that makes cygwait() reentrant, to fix these hangs. Addresses: https://cygwin.com/pipermail/cygwin/2024-December/256954.html Fixes: d243e51ef1d3 ("Cygwin: signal: Fix deadlock between main thread and sig thread") Reported-by: Daisuke Fujimura <[email protected]> Reviewed-by: Corinna Vinschen <[email protected]> Signed-off-by: Takashi Yano <[email protected]> (cherry picked from commit 83afe3e238cd12fb7d4799ba6b3c77e9e3618d91) Diff: --- winsup/cygwin/sigproc.cc | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index 58a9e5a31..2759d1624 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -742,6 +742,9 @@ sig_send (_pinfo *p, siginfo_t& si, _cygtls *tls) memcpy (p, si._si_commune._si_str, n); p += n; } + unsigned cw_mask; + cw_mask = pack.si.si_signo == __SIGFLUSHFAST ? 0 : cw_sig_restart; + DWORD nb; BOOL res; /* Try multiple times to send if packsize != nb since that probably @@ -751,8 +754,7 @@ sig_send (_pinfo *p, siginfo_t& si, _cygtls *tls) res = WriteFile (sendsig, leader, packsize, &nb, NULL); if (!res || packsize == nb) break; - if (cygwait (NULL, 10, cw_sig_eintr) == WAIT_SIGNALED) - _my_tls.call_signal_handler (); + cygwait (NULL, 10, cw_mask); res = 0; } @@ -785,7 +787,7 @@ sig_send (_pinfo *p, siginfo_t& si, _cygtls *tls) if (wait_for_completion) { sigproc_printf ("Waiting for pack.wakeup %p", pack.wakeup); - rc = cygwait (pack.wakeup, WSSC); + rc = cygwait (pack.wakeup, WSSC, cw_mask); ForceCloseHandle (pack.wakeup); } else @@ -806,9 +808,6 @@ sig_send (_pinfo *p, siginfo_t& si, _cygtls *tls) rc = -1; } - if (wait_for_completion && si.si_signo != __SIGFLUSHFAST) - _my_tls.call_signal_handler (); - out: if (communing && rc) {
