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>