Date: Thu, 03 Mar 2005 18:46:57 +0800 From: David Xu <davidxu@freebsd.org> To: Andriy Tkachuk <andrit@ukr.net> Cc: threads@freebsd.org Subject: Re: patch for threads/76690 - critical - fork hang in child for-lc_r Message-ID: <4226EB21.9090401@freebsd.org> In-Reply-To: <012901c51fd3$131e23b0$090210ac@BORJA> References: <012901c51fd3$131e23b0$090210ac@BORJA>
next in thread | previous in thread | raw e-mail | index | archive | help
Andriy Tkachuk wrote: >>>>Hmm, libc_r and libpthread handle spinlock differently which malloc >>>>uses to protect itself, some real world benchmarks are better than >>>> >>>> >>this. >> >> > >yes , you right, David. one have to check __isthreaded before >firing _SPINLOCK. there will be nothing wrong, because > >static spinlock_t thread_lock = _SPINLOCK_INITIALIZER; > >initialyzed regardless __isthreaded in malloc.c but >for optimization probably it is worth to add this check. >Take a look on updated patch. > >btw: i don't see the unlock in child in libpthread. there must be two >unlocks >- in child & in parent, doesn't it? : > ># grep __malloc_lock -r libpthread >libpthread/thread/thr_fork.c: _spinlock(__malloc_lock); >libpthread/thread/thr_fork.c: if ((_kse_isthreaded() != 0) && >(__malloc_lock != NULL)) { >libpthread/thread/thr_fork.c: _spinunlock(__malloc_lock); ># > > in libpthread, all spinlocks hold by current thread are reinitialized by _thr_spinlock_init() in thr_spinlock.c, so in child process, it is not needed to unlocked it again. After a fork(), in child process, current thread is a fresh thread which should never hold any lock. David Xu
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4226EB21.9090401>