Date: Fri, 25 Jan 2008 11:00:05 GMT From: Gary Stanley <gary@velocity-servers.net> To: freebsd-threads@FreeBSD.org Subject: Re: threads/119920: fork broken in libpthread Message-ID: <200801251100.m0PB05sM043838@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR threads/119920; it has been noted by GNATS. From: Gary Stanley <gary@velocity-servers.net> To: bug-followup@FreeBSD.org Cc: Subject: Re: threads/119920: fork broken in libpthread Date: Fri, 25 Jan 2008 05:50:28 -0500 Can you try this patch? I ported it from some mail regarding this issue on threads@ diff -ur lib/libpthread/thread/thr_kern.c lib/libpthread/thread/thr_kern.c --- lib/libpthread/thread/thr_kern.c 2006-03-16 23:29:07.000000000 +0000 +++ lib/libpthread/thread/thr_kern.c 2008-01-25 10:33:23.000000000 +0000 @@ -345,6 +345,17 @@ _LCK_SET_PRIVATE2(&curthread->kse->k_lockusers[i], NULL); } curthread->kse->k_locklevel = 0; + + /* + * Reinitialize the thread and signal locks so that + * sigaction() will work after a fork(). + */ + _lock_reinit(&curthread->lock, LCK_ADAPTIVE, _thr_lock_wait, + _thr_lock_wakeup); + _lock_reinit(&_thread_signal_lock, LCK_ADAPTIVE, _kse_lock_wait, + _kse_lock_wakeup); + + _thr_spinlock_init(); if (__isthreaded) { _thr_rtld_fini(); @@ -354,6 +365,20 @@ curthread->kse->k_kcb->kcb_kmbx.km_curthread = NULL; curthread->attr.flags |= PTHREAD_SCOPE_SYSTEM; + /* + * After a fork, it is possible that an upcall occurs in + * the parent KSE that fork()'d before the child process + * is fully created and before its vm space is copied. + * During the upcall, the tcb is set to null or to another + * thread, and this is what gets copied in the child process + * when the vm space is cloned sometime after the upcall + * occurs. Note that we shouldn't have to set the kcb, but + * we do it for completeness. + */ + _kcb_set(curthread->kse->k_kcb); + _tcb_set(curthread->kse->k_kcb, curthread->tcb); + + /* After a fork(), there child should have no pending signals. */ sigemptyset(&curthread->sigpend);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200801251100.m0PB05sM043838>