threads/119920: fork broken in libpthread
Landon Fuller
landonf at bikemonkey.org
Tue Jan 29 12:59:02 PST 2008
On Jan 24, 2008, at 07:08, Daniel Eischen wrote:
> On Thu, 24 Jan 2008, Julian Elischer wrote:
>
>> Gary Stanley wrote:
>>> The following reply was made to PR threads/119920; it has been
>>> noted by
>>> GNATS.
>>>
>>> From: Gary Stanley <gary at velocity-servers.net>
>>> To: bug-followup at FreeBSD.org
>>> Cc: Subject: Re: threads/119920: fork broken in libpthread
>>> Date: Thu, 24 Jan 2008 03:24:47 -0500
>>>
>>> I also have this problem, see threads/118715
>>> I was able to grab some ktrace info, but most of the time the
>>> process is
>>> stuck, and ktrace doesn't display any data.
>>> _______________________________________________
>>> freebsd-threads at freebsd.org mailing list
>>> http://lists.freebsd.org/mailman/listinfo/freebsd-threads
>>> To unsubscribe, send any mail to "freebsd-threads-
>>> unsubscribe at freebsd.org"
>>
>> dan what IS the fix for this? I assume you must have fixed it in -
>> current/7
>
> You want cvs diff -u -r1.126 -r1.128 src/lib/libkse/thread/thr_kern.c.
> The WARNS'ify diffs are not necessary, so it should look something
> like shown below. Probably an MFC of all of libkse (minus jasone's
> malloc changes) should be done to -7 and -6.
There appears to be a remaining issue I'm still seeing locally, with
the above patch; I wasn't able to reproduce this on 6.2:
#0 0x0000000800648b13 in mutex_lock_common (curthread=0x0,
m=0x8007616e8, abstime=0x0) at /usr/src/lib/libpthread/thread/
thr_mutex.c:503
#1 0x000000080064ac25 in _pthread_mutex_lock (m=0x8007616e8) at /usr/
src/lib/libpthread/thread/thr_mutex.c:868
#2 0x000000080063e9ce in _spinlock (lck=0x8009ac200) at /usr/src/lib/
libpthread/thread/thr_spinlock.c:97
#3 0x00000008007eafc3 in pubrealloc (ptr=0x0, size=24,
func=0x8008802b7 " in malloc():") at /usr/src/lib/libc/stdlib/
malloc.c:1090
#4 0x00000008007eb1e1 in malloc (size=24) at /usr/src/lib/libc/
stdlib/malloc.c:1150
#5 0x000000080065ab8c in _lockuser_init (lu=0x52e068, priv=0x52e000)
at /usr/src/lib/libpthread/sys/lock.c:99
#6 0x000000080065ac69 in _lockuser_reinit (lu=0x52e068,
priv=0x52e000) at /usr/src/lib/libpthread/sys/lock.c:128
#7 0x000000080064d6d0 in _kse_single_thread (curthread=0x50cc00) at /
usr/src/lib/libpthread/thread/thr_kern.c:343
#8 0x000000080063b627 in _fork () at /usr/src/lib/libpthread/thread/
thr_fork.c:101
#9 0x00000000004008f1 in forker ()
#10 0x000000080064516e in thread_start (curthread=0x50cc00,
start_routine=0x4008e0 <forker>, arg=0x0) at /usr/src/lib/libpthread/
thread/thr_create.c:341
#11 0x00000008007b3cd9 in makectx_wrapper (ucp=0x800530860,
func=0x800645150 <thread_start>, args=0x7fffff7fcfd0) at /usr/src/lib/
libc/amd64/gen/makecontext.c:100
#12 0x0000000000000000 in ?? ()
#13 0x000000000050cc00 in ?? ()
#14 0x00000000004008e0 in frame_dummy ()
via this reproduction case:
#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
void *forker (void *arg) {
while (1) {
pid_t pid = fork();
if (pid == 0) {
exit(0);
} else if (pid > 0) {
int status;
waitpid(pid, &status, 0);
} else {
printf("Fork failed\n");
abort();
}
}
}
int main(void) {
int i = 0;
for (i = 0; i < 4; i++) {
pthread_t thr;
pthread_create(&thr, NULL, forker, NULL);
pthread_detach(thr);
}
while(1)
sleep(1000);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: PGP.sig
Type: application/pgp-signature
Size: 186 bytes
Desc: This is a digitally signed message part
Url : http://lists.freebsd.org/pipermail/freebsd-threads/attachments/20080129/0cd1242c/PGP.pgp
More information about the freebsd-threads
mailing list