From b6a94e2621e2088140f4ab4a4585b42948044852 Mon Sep 17 00:00:00 2001 From: Takashi Yano Date: Tue, 21 Jan 2025 02:47:57 +0900 Subject: [PATCH] Cygwin: signal: Do not handle signal when __SIGFLUSHFAST is sent The commit a22a0ad7c4f0 was not exactly the correct thing. Even with the patch, some hangs still happen. This patch overrides the previous commit togerther with the patch making cygwait() reentrant to fix these hangs. Addresses: https://cygwin.com/pipermail/cygwin/2024-December/256954.html Addresses: https://cygwin.com/pipermail/cygwin/2024-December/256987.html Fixes: d243e51ef1d3 ("Cygwin: signal: Fix deadlock between main thread and sig thread") Fixes: a22a0ad7c4f0 ("Cygwin: signal: Do not handle signal when __SIGFLUSHFAST is sent") Reported-by: Daisuke Fujimura Reported-by: Jeremy Drake Reviewed-by: Signed-off-by: Takashi Yano --- winsup/cygwin/sigproc.cc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index cf43aa9335..474abe1495 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -742,6 +742,12 @@ sig_send (_pinfo *p, siginfo_t& si, _cygtls *tls) memcpy (p, si._si_commune._si_str, n); p += n; } + unsigned cw_mask; + if (pack.si.si_signo == __SIGFLUSHFAST) + cw_mask = 0; + else + cw_mask = cw_sig_restart; + DWORD nb; BOOL res; /* Try multiple times to send if packsize != nb since that probably @@ -751,8 +757,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 +790,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 +811,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) {