diff options
author | Alexander Kabaev <kan@FreeBSD.org> | 2008-12-01 21:00:25 +0000 |
---|---|---|
committer | Alexander Kabaev <kan@FreeBSD.org> | 2008-12-01 21:00:25 +0000 |
commit | 97df383415d94a9e8b225905ce68a2117d056c63 (patch) | |
tree | c467eaf939ad5732ac5b5657c1bf512e8f76eeb1 /lib/libthr | |
parent | 92bf0e27a047ef49a5ccda4add108748d7fba923 (diff) | |
download | src-97df383415d94a9e8b225905ce68a2117d056c63.tar.gz src-97df383415d94a9e8b225905ce68a2117d056c63.zip |
Invoke _rtld_atfork_post earlier, before we reinitialize rtld locks
by switching into single-thread mode.
libthr ignores broken use of lock bitmaps used by default rtld locking
implementation, this in turn turns lock handoff in _rtld_thread_init
into NOP. This in turn makes child processes of forked multi-threaded
programs to run with _thr_signal_block still in effect, with most
signals blocked.
Reported by: phk, kib
Notes
Notes:
svn path=/head/; revision=185531
Diffstat (limited to 'lib/libthr')
-rw-r--r-- | lib/libthr/thread/thr_fork.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/lib/libthr/thread/thr_fork.c b/lib/libthr/thread/thr_fork.c index 18a9a05fb459..0288dc2f6042 100644 --- a/lib/libthr/thread/thr_fork.c +++ b/lib/libthr/thread/thr_fork.c @@ -158,6 +158,9 @@ _fork(void) /* clear other threads locked us. */ _thr_umutex_init(&curthread->lock); _thr_umutex_init(&_thr_atfork_lock); + + if (unlock_malloc) + _rtld_atfork_post(rtld_locks); _thr_setthreaded(0); /* reinitialize libc spinlocks. */ @@ -170,10 +173,8 @@ _fork(void) /* Ready to continue, unblock signals. */ _thr_signal_unblock(curthread); - if (unlock_malloc) { - _rtld_atfork_post(rtld_locks); + if (unlock_malloc) _malloc_postfork(); - } /* Run down atfork child handlers. */ TAILQ_FOREACH(af, &_thr_atfork_list, qe) { |