[PATCH v2 3/7] Cygwin: signal: Cleanup signal queue after processing it
Corinna Vinschen
corinna-cygwin@cygwin.com
Wed Nov 27 16:37:55 GMT 2024
Hi Takashi,
On Nov 26 17:55, Takashi Yano wrote:
> The queue is once cleaned up, however, sigpacket::process() may set
> si_signo in the queue to 0 by calling sig_clear(). This patch adds
> another loop for cleanup after calling sigpacket::process().
>
> Addresses: https://cygwin.com/pipermail/cygwin/2024-November/256744.html
> Fixes: 9d2155089e87 ("(wait_sig): Define variable q to be the start of the signal queue. Just iterate through sigq queue, deleting processed or zeroed signals")
> Reported-by: Christian Franke <Christian.Franke@t-online.de>
> Reviewed-by:
> Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
> ---
> winsup/cygwin/sigproc.cc | 11 +++++++++++
> 1 file changed, 11 insertions(+)
>
> diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc
> index 8f46a80ab..b8d961a07 100644
> --- a/winsup/cygwin/sigproc.cc
> +++ b/winsup/cygwin/sigproc.cc
> @@ -1463,6 +1463,17 @@ wait_sig (VOID *)
> qnext->si.si_signo = 0;
> }
> }
> + /* Cleanup sigq chain. Remove entries having si_signo == 0.
> + There were once cleaned obeve, however sigpacket::process()
> + may set si_signo to 0 using sig_clear(). */
> + q = &sigq.start;
> + while ((qnext = q->next))
> + {
> + if (qnext->si.si_signo)
> + q = qnext;
> + else
> + q->next = qnext->next;
> + }
I'm not quite sure, but wouldn't it make more sense to change
sig_clear() so that it actually removes the entries from the queue
immediately? Using Interlocked functions on the queue may even
avoid locking...
Thanks,
Corinna
More information about the Cygwin-patches
mailing list