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?

Thanks,
Corinna

Reply via email to