summaryrefslogtreecommitdiff
path: root/lib/libc/stdlib
diff options
context:
space:
mode:
authorjoerg <joerg@NetBSD.org>2020-01-13 19:14:37 +0000
committerjoerg <joerg@NetBSD.org>2020-01-13 19:14:37 +0000
commitbaedc30b633c883fcd1593560d2dd3fa776888d8 (patch)
treeca0b625fe8b15e6ee9dc09629547332ba44777e7 /lib/libc/stdlib
parent87d491cfa0f9da5b472a0b3b968d19c5ee980d60 (diff)
Fix atfork malloc handling to include all the locks in old jemalloc.
Diffstat (limited to 'lib/libc/stdlib')
-rw-r--r--lib/libc/stdlib/jemalloc.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/lib/libc/stdlib/jemalloc.c b/lib/libc/stdlib/jemalloc.c
index a2694e5feb6..836a23110e6 100644
--- a/lib/libc/stdlib/jemalloc.c
+++ b/lib/libc/stdlib/jemalloc.c
@@ -1,4 +1,4 @@
-/* $NetBSD: jemalloc.c,v 1.47 2020/01/13 19:14:02 joerg Exp $ */
+/* $NetBSD: jemalloc.c,v 1.48 2020/01/13 19:14:37 joerg Exp $ */
/*-
* Copyright (C) 2006,2007 Jason Evans <jasone@FreeBSD.org>.
@@ -118,7 +118,7 @@
#include <sys/cdefs.h>
/* __FBSDID("$FreeBSD: src/lib/libc/stdlib/malloc.c,v 1.147 2007/06/15 22:00:16 jasone Exp $"); */
-__RCSID("$NetBSD: jemalloc.c,v 1.47 2020/01/13 19:14:02 joerg Exp $");
+__RCSID("$NetBSD: jemalloc.c,v 1.48 2020/01/13 19:14:37 joerg Exp $");
#ifdef __FreeBSD__
#include "libc_private.h"
@@ -3986,16 +3986,17 @@ _malloc_prefork(void)
unsigned i;
/* Acquire all mutexes in a safe order. */
-
+ malloc_mutex_lock(&init_lock);
malloc_mutex_lock(&arenas_mtx);
for (i = 0; i < narenas; i++) {
if (arenas[i] != NULL)
malloc_mutex_lock(&arenas[i]->mtx);
}
-
- malloc_mutex_lock(&base_mtx);
-
malloc_mutex_lock(&chunks_mtx);
+ malloc_mutex_lock(&base_mtx);
+#ifdef USE_BRK
+ malloc_mutex_lock(&brk_mtx);
+#endif
}
void
@@ -4004,16 +4005,18 @@ _malloc_postfork(void)
unsigned i;
/* Release all mutexes, now that fork() has completed. */
-
- malloc_mutex_unlock(&chunks_mtx);
-
+#ifdef USE_BRK
+ malloc_mutex_unlock(&brk_mtx);
+#endif
malloc_mutex_unlock(&base_mtx);
+ malloc_mutex_unlock(&chunks_mtx);
- for (i = 0; i < narenas; i++) {
+ for (i = narenas; i-- > 0; ) {
if (arenas[i] != NULL)
malloc_mutex_unlock(&arenas[i]->mtx);
}
malloc_mutex_unlock(&arenas_mtx);
+ malloc_mutex_unlock(&init_lock);
}
/*