diff options
Diffstat (limited to 'libc/upstream-dlmalloc/malloc.c')
-rw-r--r-- | libc/upstream-dlmalloc/malloc.c | 17 |
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; } |