Skip site navigation (1)Skip section navigation (2)
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>