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 exactly the correct thing. Even with
the patch, some hangs still happen. This patch overrides the previous
commit to fix these hangs.

Addresses: https://cygwin.com/pipermail/cygwin/2024-December/256987.html
Fixes: a22a0ad ("Cygwin: signal: Do not handle signal when __SIGFLUSHFAST is sent")
Reported-by: Jeremy Drake <[email protected]>
Reviewed-by:
Signed-off-by: Takashi Yano <[email protected]>
  • Loading branch information
tyan0 authored and jeremyd2019 committed Jan 18, 2025
1 parent 3506dba commit 0f82cd1
Showing 1 changed file with 27 additions and 6 deletions.
33 changes: 27 additions & 6 deletions winsup/cygwin/sigproc.cc
Original file line number Diff line number Diff line change
Expand Up @@ -751,8 +751,19 @@ 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 ();
if (pack.si.si_signo == __SIGFLUSHFAST)
Sleep (10);
else /* Handle signals */
do
{
DWORD rc = WaitForSingleObject (_my_tls.get_signal_arrived (), 10);
if (rc == WAIT_OBJECT_0)
{
_my_tls.call_signal_handler ();
continue;
}
}
while (false);
res = 0;
}

Expand Down Expand Up @@ -785,7 +796,20 @@ 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);
if (pack.si.si_signo == __SIGFLUSHFAST)
rc = WaitForSingleObject (pack.wakeup, WSSC);
else /* Handle signals */
do
{
HANDLE w[2] = {pack.wakeup, _my_tls.get_signal_arrived ()};
rc = WaitForMultipleObjects (2, w, FALSE, WSSC);
if (rc == WAIT_OBJECT_0 + 1) /* signal arrived */
{
_my_tls.call_signal_handler ();
continue;
}
}
while (false);
ForceCloseHandle (pack.wakeup);
}
else
Expand All @@ -806,9 +830,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 0f82cd1

Please sign in to comment.