Date: Fri, 7 Mar 2008 08:26:14 -0500 From: John Baldwin <jhb@freebsd.org> To: freebsd-hackers@freebsd.org Cc: "Marko, Shaun" <Shaun.Marko@lodgenet.com> Subject: Re: libpthread/fork issue Message-ID: <200803070826.14877.jhb@freebsd.org> In-Reply-To: <87D91DEDB1111C44BBFB9E3E90FF1E6E9553E0@host.lodgenet.com> References: <87D91DEDB1111C44BBFB9E3E90FF1E6E9553E0@host.lodgenet.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thursday 06 March 2008 10:45:15 pm Marko, Shaun wrote: > I'm working on FreeBSD 6.2 and I'm wondering if anybody can help with an > issue I've found using fork and threads. The attached program > demonstrates the problem. In short, if a process creates a thread, joins > the thread, then forks a child process which creates a thread, the > child's attempt to create a thread will cause the program to dump core > with the following error message: > Fatal error 'mutex is on list' at line 540 in file > /usr/src/lib/libpthread/thread/thr_mutex.c (errno = 0). > > This seems to be true using an SMP or UP kernel. > > If you run the attached program with no arguments, the parent process > will not create and join a thread and will not crash. Here is the > output: > [Sherlock]$ ./threadTest > child: born > child: thread created > child: thread joined > parent: child died > > If you run the attached program with "-crash", the parent process > creates and joins a thread, causing the error: > [Sherlock]$ ./threadTest -crash > parent: thread created > parent: thread joined > child: born > Fatal error 'mutex is on list' at line 540 in file > /usr/src/lib/libpthread/thread/thr_mutex.c (errno = 0) > parent: child died > > Here is the backtrace of the resulting core: > #0 0x28097537 in pthread_testcancel () from /lib/libpthread.so.2 > [New Thread 0x8053200 (LWP 100163)] > [New Thread 0x8053000 (LWP 100201)] > (gdb) where > #0 0x28097537 in pthread_testcancel () from /lib/libpthread.so.2 > #1 0x2808689a in sigaction () from /lib/libpthread.so.2 > #2 0x2808088d in pthread_kill () from /lib/libpthread.so.2 > #3 0x28080256 in raise () from /lib/libpthread.so.2 > #4 0x28159b78 in abort () from /lib/libc.so.6 > #5 0x28097c6f in pthread_testcancel () from /lib/libpthread.so.2 > #6 0x2808c85f in _pthread_mutex_trylock () from /lib/libpthread.so.2 > #7 0x2808d590 in _pthread_mutex_lock () from /lib/libpthread.so.2 > #8 0x28083361 in _spinlock () from /lib/libpthread.so.2 > #9 0x280f7ddb in _UTF8_init () from /lib/libc.so.6 > #10 0x28172940 in _thread_autoinit_dummy_decl_stub () from > /lib/libc.so.6 > #11 0x28074200 in ?? () > #12 0x2804f405 in symlook_obj () from /libexec/ld-elf.so.1 > #13 0x280883ff in pthread_attr_init () from /lib/libpthread.so.2 > #14 0x280848fd in sigaction () from /lib/libpthread.so.2 > #15 0x2808e915 in pthread_mutexattr_init () from /lib/libpthread.so.2 > #16 0x28088116 in pthread_create () from /lib/libpthread.so.2 > #17 0x08048795 in spawnThread (caller=0x80489f0 "child") at > threadTest.c:21 > #18 0x08048879 in main (argc=2, argv=0x17e) at threadTest.c:62 > > Any help would be greatly appreciated. POSIX only lets you call exec() from a child process of a multithreaded app. Either fork before creating threads or just create more threads rather than forking. -- John Baldwin
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200803070826.14877.jhb>