cvs commit: src/sys/kern kern_exit.c

John Baldwin jhb at freebsd.org
Mon Oct 23 15:49:10 UTC 2006


On Sunday 22 October 2006 01:54, David Xu wrote:
> On Sunday 22 October 2006 08:14, Don Lewis wrote:
> > On 21 Oct, David Xu wrote:
> > > davidxu     2006-10-21 23:59:15 UTC
> > >
> > >   FreeBSD src repository
> > >
> > >   Modified files:
> > >     sys/kern             kern_exit.c
> > >   Log:
> > >   Since revision 1.333 of kern_sig.c no longer uses P_WEXIT, the change
> > >   opened a race window which can cause memory leak in signal queue.
> > >   Here we free memory for signal queue when process state is set to
> > >   PRS_ZOMBIE.
> > >
> > >   Revision  Changes    Path
> > >   1.291     +8 -2      src/sys/kern/kern_exit.c
> >
> > I wonder if the earlier change is what broke portupgrade after I
> > upgraded from an August 31st version of current to yesterday's version.
> > The symptoms were random processes dying from SIGHUP.  It was easy to
> > reproduce by just going to a port directory and running
> > 	script foo make clean
> > a few times.  I'd randomly see make complain about a non-zero exit
> > status from uname or some other sub-process.  I tracked the problem back
> > to the SIGHUP bit being set in td2's sigqueue in fork1().   As a
> > workaround, I added a call to sigqueue_init() where td2 gets bzero'ed.
> >
> > Disappearing back into the void ...
> 
> But I am still worrried by these signal changes, if an exiting process
> can be sent a signal, and msleep will interrupted in cleanup code, where the
> code will return to ? in normal case, code will return to userland,  and 
> signal will be removed and delivered, but if a thread is in exit1(), where
> the code can be returned to ?  if a cleanup procedure is interrupted,  isn't 
> there is any resource leak or dead-loop if it is retried because signal is 
> never removed ?

It will return to the exit1() function. :)  If a process has W_EXIT set and is 
asleep in msleep() with PCATCH, it called msleep() from exit1() or some other 
number of functions in between the two.  Note that this was the behavior of 
FreeBSD prior to the Linux threads stuff (and BSD).

-- 
John Baldwin


More information about the cvs-src mailing list