patch for threads/76690 - critical - fork hang in child for-lc_r
David Xu
davidxu at freebsd.org
Thu Mar 3 10:47:00 GMT 2005
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
More information about the freebsd-threads
mailing list