Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 11 Apr 2012 16:44:44 +0200
From:      Mel Flynn <rflynn@acsalaska.net>
To:        Ian Lepore <freebsd@damnhippie.dyndns.org>
Cc:        FreeBSD Hackers <freebsd-hackers@freebsd.org>
Subject:   Re: Debugging zombies: pthread_sigmask and sigwait
Message-ID:  <4F8598DC.9010508@acsalaska.net>
In-Reply-To: <1334154373.1082.110.camel@revolution.hippie.lan>
References:  <4F859112.5070005@acsalaska.net> <1334154373.1082.110.camel@revolution.hippie.lan>

next in thread | previous in thread | raw e-mail | index | archive | help
On 4/11/2012 16:26, Ian Lepore wrote:
> On Wed, 2012-04-11 at 16:11 +0200, Mel Flynn wrote:

>> 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.

> 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);

That doesn't change anything and is in contrast to what sigwait(2) says:

     The signals specified by set /should be blocked/ at the time of the
     call to sigwait().

I also thought about a different child touching the signal code and two
processes blocked in sigwait in the original code (they fork a logger
process prior to sigemptyset()), but I explicitly avoid that in the test
case.
-- 
Mel



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4F8598DC.9010508>