Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 18 Sep 2008 19:27:47 +0200
From:      David Naylor <naylor.b.david@gmail.com>
To:        Daniel Eischen <deischen@freebsd.org>
Cc:        Tom Evans <tevans.uk@googlemail.com>, freebsd-current@freebsd.org
Subject:   Re: FreeBSD deadlock (with fork?)
Message-ID:  <200809181927.52384.naylor.b.david@gmail.com>
In-Reply-To: <Pine.GSO.4.64.0809181308140.19815@sea.ntplx.net>
References:  <200809180631.47071.naylor.b.david@gmail.com> <200809181857.25872.naylor.b.david@gmail.com> <Pine.GSO.4.64.0809181308140.19815@sea.ntplx.net>

index | next in thread | previous in thread | raw e-mail

[-- Attachment #1 --]
On Thursday 18 September 2008 19:13:19 Daniel Eischen wrote:
> On Thu, 18 Sep 2008, David Naylor wrote:
> > On Thursday 18 September 2008 15:33:52 Tom Evans wrote:
> >> On Thu, 2008-09-18 at 06:31 +0200, David Naylor wrote:
> >>> Hi,
> >>>
> >>> I have a program that spawns a lot of subprocesses (with pipes open)
> >>> from multiple threads.  The problem is the program often deadlocks, but
> >>> not consistently.  Sometimes the program can run over 5 times to
> >>> competition without incidence and yet othertimes it locks within a few
> >>> seconds.
> >>
> >> Do you create threads, which then fork(), or do you fork() and then
> >> create threads?
> >
> > I have many threads that then fork.  (aka forking threads).
> >
> >> I think the former will not work..
> >
> > Is there any reason for this and is this a FreeBSD limitation or a
> > general problem?
>
> No, the former will work.  You can fork() from threads, only as long
> as your forked processes only call async-signal-safe functions or
> some form of exec().  For instance, you can't fork and then create
> new threads from that child process.  If you are not immediately
> exec()'ing from the child process, then you have to be careful
> and only use async-signal-safe functions.
>
> Remember that you have multiple threads in the parent, so the
> state of libthr, libc, etc may be inconsistent in a child
> process.

If you have a look at the backtrace from my original post you will see that 
all my threads are getting locked.  The program I am using is python and the 
call that is forking is Popen(['some', 'program'], stdout=PIPE, 
stderr=STDOUT).  As far as I know it just sets up the pipes and does an 
execvp.  (See 
http://svn.python.org/view/*checkout*/python/tags/r252/Lib/subprocess.py?content-type=text%2Fplain&rev=60915 
from line 981 to 1091).  [[I tried appending close_fds=True to the argument, 
it appeared to make the program deadlock less often...]]

Any ideas as to what might be causing this dead lock (and why all the threads 
are stopping in amd64 specific assembler)?

[-- Attachment #2 --]
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.4 (FreeBSD)

iD8DBQBI0o+YUaaFgP9pFrIRArHCAJ4unxSPffSggossGz7l1Gz0LF8xugCfci3D
c8wugKdG9K5F8CapMNITo7Y=
=nEFp
-----END PGP SIGNATURE-----
help

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200809181927.52384.naylor.b.david>