On Dec  3 23:01, Takashi Yano wrote:
> If process() failed and the signal remains in the queue, the most
> possible reason is that the target thread already armed by another
> signal and do not handle it yet. With this patch, to increase the
> chance of handling it in the other threads, call yield() before
> retrying process().
> 
> Addresses: https://cygwin.com/pipermail/cygwin/2024-November/256744.html
> Fixes: e10f822a2b39 ("Cygwin: signal: Handle queued signal without explicit 
> __SIGFLUSH")
> Reported-by: Christian Franke <christian.fra...@t-online.de>
> Reviewed-by:
> Signed-off-by: Takashi Yano <takashi.y...@nifty.ne.jp>
> ---
>  winsup/cygwin/sigproc.cc | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc
> index 4c557f048..7e02e61f7 100644
> --- a/winsup/cygwin/sigproc.cc
> +++ b/winsup/cygwin/sigproc.cc
> @@ -1342,7 +1342,10 @@ wait_sig (VOID *)
>       pack.si.si_signo = __SIGFLUSH;
>        else if (sigq.start.next
>              && PeekNamedPipe (my_readsig, NULL, 0, NULL, &nb, NULL) && !nb)
> -     pack.si.si_signo = __SIGFLUSH;
> +     {
> +       yield ();
> +       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)
> -- 
> 2.45.1

LGTM.


Thanks,
Corinna

Reply via email to