Debugging zombies: pthread_sigmask and sigwait

Konstantin Belousov kostikbel at gmail.com
Wed Apr 11 14:47:31 UTC 2012


On Wed, Apr 11, 2012 at 08:26:13AM -0600, Ian Lepore wrote:
> On Wed, 2012-04-11 at 16:11 +0200, Mel Flynn wrote:
> > Hi,
> > 
> > I'm currently stuck on a bug in Zarafa-spooler that creates zombies. and
> > working around it by claiming that our pthread library isn't "normal"
> > which uses standard signals rather then a signal thread.
> > 
> > My limited understanding of these facilities is however not enough to
> > see the actual problem here and reading of related manpages did not lead
> > me to a solution either. A test case reproducing the problem is attached.
> > 
> > What happens is that SIGCHLD is never received by the signal thread and
> > the child processes turn to zombies. Signal counters never go up, not
> > even for SIGINFO, which I added specifically to see if anything gets
> > through at all.
> > 
> > The signal thread shows being stuck in sigwait. It's reproducible on
> > 8.3-PRERELEASE of a few days ago (r233768). I'm not able to test it on
> > anything newer unfortunately, but I suspect this is a bug/linuxism in
> > the code not in FreeBSD.
> > 
> > Thanks in advance for any insights.
> > _______________________________________________
> > freebsd-hackers at freebsd.org mailing list
> > http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> > To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"
> 
> The signal mask for a new thread is inherited from the parent thread.
> In your example code, the signal handling thread inherits the blocked
> status of the signals as set up in main().  Try adding this line to
> signal_handler() before it goes into its while() loop:
> 
>  pthread_sigmask(SIG_UNBLOCK, &signal_mask, NULL);

This is completely wrong. sigwait(2) requires the waited signals to be
blocked, so the code is right in this regard.

What happens, as I guess it, the SIGINFO and SIGCHLD are ignored, so
kernel do not even bother to queue the signals to the master process.
Register a dummy signal handler for your signals with sigaction
before creating 'signal_handler' thread.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 196 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-hackers/attachments/20120411/49e04907/attachment.pgp


More information about the freebsd-hackers mailing list