aboutsummaryrefslogtreecommitdiffstats
path: root/libc/upstream-dlmalloc/malloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc/upstream-dlmalloc/malloc.c')
-rw-r--r--libc/upstream-dlmalloc/malloc.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/libc/upstream-dlmalloc/malloc.c b/libc/upstream-dlmalloc/malloc.c
index 5e675b459..c6a32c8c4 100644
--- a/libc/upstream-dlmalloc/malloc.c
+++ b/libc/upstream-dlmalloc/malloc.c
@@ -3099,6 +3099,9 @@ static void post_fork_child(void) { INITIAL_LOCK(&(gm)->mutex); }
/* 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 @@ static int init_mparams(void) {
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 @@ static int init_mparams(void) {
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 @@ static int init_mparams(void) {
}
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;
}