On Tue, 3 Dec 2024 15:41:45 +0100
Corinna Vinschen wrote:
> On Dec  3 23:01, Takashi Yano wrote:
> > The queue is cleaned up by removing the entries having si_signo == 0
> > while processing the queued signals, however, sigpacket::process() may
> > set si_signo in the queue to 0 of the entry already processed but not
> > succeed by calling sig_clear(). This patch ensures the sig_clear()
> > to remove the entry from the queue chain. For this purpose, the pointer
> > prev has been added to the sigpacket. This is to handle the following
> > case appropriately.
> > 
> > Consider the queued signal chain of:
> > A->B->C->D
> > without pointer prev. Assume that the pointer 'q' and 'qnext' point to
> > C, and process() is processing C. If B is cleared in process(), A->next
> > should be set to to C in sigpacket::clear().
> > 
> > Then, if process() for C succeeds, C should be removed from the queue,
> > so A->next should be set to D. However, we cannot do that because we do
> > not have the pointer to A in the while loop in wait_sig().
> > 
> > With the pointer prev, we can easily access A and C in sigpacket::clear()
> > as well as A and D in the while loop in wait_sig() using the pointer prev
> > and next without pursuing the chain.
> 
> Sounds good.  The concurrency problem is still open, right?

Yes. Please wait a while.

-- 
Takashi Yano <takashi.y...@nifty.ne.jp>

Reply via email to