aboutsummaryrefslogtreecommitdiff
path: root/lib/libthr
diff options
context:
space:
mode:
authorAlexander Kabaev <kan@FreeBSD.org>2008-12-01 21:00:25 +0000
committerAlexander Kabaev <kan@FreeBSD.org>2008-12-01 21:00:25 +0000
commit97df383415d94a9e8b225905ce68a2117d056c63 (patch)
treec467eaf939ad5732ac5b5657c1bf512e8f76eeb1 /lib/libthr
parent92bf0e27a047ef49a5ccda4add108748d7fba923 (diff)
downloadsrc-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.c7
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) {