From e67f54ab1a6253dd69cb2c770d785c7eb6d2172c Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Thu, 22 Sep 2016 01:45:48 +0200 Subject: hurdmalloc: Run fork handler as late as possible [BZ #19431] This is the hurd-specific follow-up for 29d794863cd6e03115d3670707cc873a9965ba92 : hurdmalloc also needs the same fix * hurd/hurdmalloc.c (malloc_fork_prepare): Rename to _hurd_malloc_fork_prepare. (malloc_fork_parent): Rename to _hurd_malloc_fork_parent. (malloc_fork_child): Rename to _hurd_malloc_fork_child. (_hurd_fork_prepare_hook): Drop malloc_fork_prepare. (_hurd_fork_parent_hook): Drop malloc_fork_parent. (_hurd_fork_child_hook): Drop malloc_fork_child. * hurd/hurdmalloc.h (_hurd_malloc_fork_prepare, _hurd_malloc_fork_parent, _hurd_malloc_fork_child): Add declarations. * sysdeps/mach/hurd/fork.c (__fork): Call __malloc_fork_lock_parent after locking locks (notably hurd_dtable_lock). Call _hurd_malloc_fork_prepare after that. Call _hurd_malloc_fork_parent before __malloc_fork_unlock_parent and _hurd_malloc_fork_child before __malloc_fork_unlock_child. --- sysdeps/mach/hurd/fork.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'sysdeps/mach') diff --git a/sysdeps/mach/hurd/fork.c b/sysdeps/mach/hurd/fork.c index 9973b1bb9e..9e863a8033 100644 --- a/sysdeps/mach/hurd/fork.c +++ b/sysdeps/mach/hurd/fork.c @@ -108,12 +108,6 @@ __fork (void) /* Run things that prepare for forking before we create the task. */ RUN_HOOK (_hurd_fork_prepare_hook, ()); - /* Acquire malloc locks. This needs to come last because fork - handlers may use malloc, and the libio list lock has an - indirect malloc dependency as well (via the getdelim - function). */ - call_function_static_weak (__malloc_fork_lock_parent); - /* Lock things that want to be locked before we fork. */ { void *const *p; @@ -124,6 +118,13 @@ __fork (void) } __mutex_lock (&_hurd_siglock); + /* Acquire malloc locks. This needs to come last because fork + handlers may use malloc, and the libio list lock has an + indirect malloc dependency as well (via the getdelim + function). */ + call_function_static_weak (__malloc_fork_lock_parent); + _hurd_malloc_fork_prepare (); + newtask = MACH_PORT_NULL; thread = sigthread = MACH_PORT_NULL; newproc = MACH_PORT_NULL; @@ -612,6 +613,7 @@ __fork (void) } /* Release malloc locks. */ + _hurd_malloc_fork_parent (); call_function_static_weak (__malloc_fork_unlock_parent); /* Run things that want to run in the parent to restore it to @@ -666,6 +668,7 @@ __fork (void) __sigemptyset (&_hurdsig_traced); /* Release malloc locks. */ + _hurd_malloc_fork_child (); call_function_static_weak (__malloc_fork_unlock_child); /* Run things that want to run in the child task to set up. */ -- cgit 1.4.1