Skip to content

Commit

Permalink
Cygwin: signal: Do not handle signal when __SIGFLUSHFAST is sent
Browse files Browse the repository at this point in the history
The commit a22a0ad 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: d243e51 ("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 83afe3e)
  • Loading branch information
tyan0 authored and jeremyd2019 committed Jan 21, 2025
1 parent 9f9cfe9 commit adb9c01
Showing 1 changed file with 5 additions and 6 deletions.
11 changes: 5 additions & 6 deletions winsup/cygwin/sigproc.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
}

Expand Down Expand Up @@ -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
Expand All @@ -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)
{
Expand Down

0 comments on commit adb9c01

Please sign in to comment.