Cygwin: signal: Handle queued signal without explicit __SIGFLUSH

With the previous code, the queued signal is tried to resend only when
a new signal arrives or pending_signals::pending() is called.
With this patch, if the signal is queued and the retry flag is not set
and the new signal is not received yet, the sig thread tries to handle
the queued signal again. Without this patch, the chance to handle the
queue would be delayed.

Addresses: https://cygwin.com/pipermail/cygwin/2024-November/256744.html
Fixes: 5e31c80e4e ("(pending_signals::pending): Force an additional loop through wait_sig by setting retry whenever this function is called.")
Reported-by: Christian Franke <Christian.Franke@t-online.de>
Reviewed-by: Corinna Vinschen <corinna@vinschen.de>
Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
This commit is contained in:
Takashi Yano 2024-11-25 20:19:06 +09:00
parent d243e51ef1
commit e10f822a2b
1 changed files with 3 additions and 0 deletions

View File

@ -1321,6 +1321,9 @@ wait_sig (VOID *)
sigpacket pack = {};
if (sigq.retry)
pack.si.si_signo = __SIGFLUSH;
else if (sigq.start.next
&& PeekNamedPipe (my_readsig, NULL, 0, NULL, &nb, NULL) && !nb)
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)