SIGCHLD ignored

Pedro Alves pedro@codesourcery.com
Thu Jun 12 05:51:00 GMT 2008


[moved to gdb-patches@]

Original report here:
 SIGCHLD ignored
 http://sourceware.org/ml/gdb/2008-06/msg00099.html

A Wednesday 11 June 2008 23:45:22, Pedro Alves wrote:
> A Wednesday 11 June 2008 18:21:05, Vladimir Prus wrote:
> > Pedro, I think this SIGCHLD magic is your doing -- do you have any ideas
> > how to fix it?
>
> Dang, I totally missed this could be a problem.
>
> Right, so, normal_mask has SIGCHLD blocked in _initialize_linux_nat,
> and since forking a child inherits the signal mask, the child gets
> SIGCHLD blocked by default.  This would have gone unnoticed
> if Qt unblocked SIGCHLD in it's setup (one may argue it should).
>
> It's not safe to just remove that SIGCHLD blocking, we're not
> taking care of blocking it in places we used to in sync mode
> (we used to block it the first time we hit linux_nat_wait, which
> is reached after forking an inferior).
>
> For async mode, we also need to do something about SIGCHLD
> blocking.  We have:
>
> linux_nat_create_inferior
>   -> linux_nat_async_mask
>      -> linux_nat_async
>         -> linux_nat_async_events
>            -> block SIGCHLD.
>
>   -> linux_ops->to_create_inferior (forks a child)
>
> Attached is a patch to fix this.
>
> Basically, I turned linux_nat_async_events_enabled into a
> 3-state instead of a bool, with the new state being
> "SIGCHLD unblocked with action set to whatever we get
> on startup".  Most of the SIGCHLD state management stays with
> the same logic, except that linux_nat_create_inferior gets a
> switch to the new state before forking a child, and
> linux_nat_wait, gets an unconditional switch to the blocked
> state.  The rest of the patch is mostly updating to the
> new interface.
>
> Tested on x86-64-unknown-linux-gnu sync and async modes
> without regressions.

Same code patch, but updated with a new testcase.  I imagine
we're going to touch these issues again with full
multi-process support.

-- 
Pedro Alves
-------------- next part --------------
A non-text attachment was scrubbed...
Name: sigchld.diff
Type: text/x-diff
Size: 14477 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/gdb-patches/attachments/20080612/a9bbe603/attachment.bin>


More information about the Gdb-patches mailing list