]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
hurdmalloc: Run fork handler as late as possible [BZ #19431]
authorSamuel Thibault <samuel.thibault@ens-lyon.org>
Wed, 21 Sep 2016 23:45:48 +0000 (01:45 +0200)
committerSamuel Thibault <samuel.thibault@ens-lyon.org>
Wed, 21 Sep 2016 23:45:48 +0000 (01:45 +0200)
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.

ChangeLog
hurd/hurdmalloc.c
hurd/hurdmalloc.h
sysdeps/mach/hurd/fork.c

index e9289778f09e6b865ef4371331f828e541f5b3ff..b2add6a3e374067c77860f9dab1657ac6bda6551 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2016-09-22  Samuel Thibault  <samuel.thibault@ens-lyon.org>
+
+       * 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.
+
 2016-09-21  James Greenhalgh  <james.greenhalgh@arm.com>
 
        * soft-fp/extendhftf2.c: New.
index 58c29fa07d5cdf81491c8e777bfac27dc9f06e6c..65fb959d8491cc45c86681002d24fef86b6110b1 100644 (file)
@@ -405,8 +405,8 @@ print_malloc_free_list (void)
 }
 #endif /* DEBUG */
 
-static void
-malloc_fork_prepare(void)
+void
+_hurd_malloc_fork_prepare(void)
 /*
  * Prepare the malloc module for a fork by insuring that no thread is in a
  * malloc critical section.
@@ -419,8 +419,8 @@ malloc_fork_prepare(void)
     }
 }
 
-static void
-malloc_fork_parent(void)
+void
+_hurd_malloc_fork_parent(void)
 /*
  * Called in the parent process after a fork() to resume normal operation.
  */
@@ -432,8 +432,8 @@ malloc_fork_parent(void)
     }
 }
 
-static void
-malloc_fork_child(void)
+void
+_hurd_malloc_fork_child(void)
 /*
  * Called in the child process after a fork() to resume normal operation.
  */
@@ -446,7 +446,4 @@ malloc_fork_child(void)
 }
 \f
 
-text_set_element (_hurd_fork_prepare_hook, malloc_fork_prepare);
-text_set_element (_hurd_fork_parent_hook, malloc_fork_parent);
-text_set_element (_hurd_fork_child_hook, malloc_fork_child);
 text_set_element (_hurd_preinit_hook, malloc_init);
index e11c208a8f44cdcdbdb663305963c0b99fbdcdb3..3520ffacd8b86972d8133334add9d36c9e255fae 100644 (file)
@@ -12,6 +12,10 @@ extern void *_hurd_malloc (size_t);
 extern void *_hurd_realloc (void *, size_t);
 extern void _hurd_free (void *);
 
+extern void _hurd_malloc_fork_prepare (void);
+extern void _hurd_malloc_fork_parent (void);
+extern void _hurd_malloc_fork_child (void);
+
 #define malloc _hurd_malloc
 #define realloc        _hurd_realloc
 #define free   _hurd_free
index 9973b1bb9e3006af3f445bdd09cec998eaf8a786..9e863a80331573b1d1f760af38db67193f8c47af 100644 (file)
@@ -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.  */