Merge "Avoid malloc lock while calling pthread_atfork."
diff --git a/libc/bionic/dlmalloc.h b/libc/bionic/dlmalloc.h
index b34165e..a00a583 100644
--- a/libc/bionic/dlmalloc.h
+++ b/libc/bionic/dlmalloc.h
@@ -24,6 +24,7 @@
 #define REALLOC_ZERO_BYTES_FREES 1
 #define USE_DL_PREFIX 1
 #define USE_LOCKS 1
+#define LOCK_AT_FORK 1
 #define USE_RECURSIVE_LOCK 0
 #define USE_SPIN_LOCKS 0
 
diff --git a/libc/upstream-dlmalloc/malloc.c b/libc/upstream-dlmalloc/malloc.c
index 0a1f6b2..d951841 100644
--- a/libc/upstream-dlmalloc/malloc.c
+++ b/libc/upstream-dlmalloc/malloc.c
@@ -3099,6 +3099,9 @@
 
 /* Initialize mparams */
 static int init_mparams(void) {
+  /* BEGIN android-added: move pthread_atfork outside of lock */
+  int first_run = 0;
+  /* END android-added */
 #ifdef NEED_GLOBAL_LOCK_INIT
   if (malloc_global_mutex_status <= 0)
     init_malloc_global_mutex();
@@ -3109,6 +3112,9 @@
     size_t magic;
     size_t psize;
     size_t gsize;
+    /* BEGIN android-added: move pthread_atfork outside of lock */
+    first_run = 1;
+    /* END android-added */
 
 #ifndef WIN32
     psize = malloc_getpagesize;
@@ -3153,9 +3159,11 @@
     gm->mflags = mparams.default_mflags;
     (void)INITIAL_LOCK(&gm->mutex);
 #endif
-#if LOCK_AT_FORK
+    /* BEGIN android-removed: move pthread_atfork outside of lock */
+#if 0 && LOCK_AT_FORK
     pthread_atfork(&pre_fork, &post_fork_parent, &post_fork_child);
 #endif
+    /* END android-removed */
 
     {
 #if USE_DEV_RANDOM
@@ -3184,6 +3192,13 @@
   }
 
   RELEASE_MALLOC_GLOBAL_LOCK();
+  /* BEGIN android-added: move pthread_atfork outside of lock */
+#if LOCK_AT_FORK
+  if (first_run != 0) {
+    pthread_atfork(&pre_fork, &post_fork_parent, &post_fork_child);
+  }
+#endif
+  /* END android-added */
   return 1;
 }