Module Name:    src
Committed By:   joerg
Date:           Mon Jan 13 19:14:38 UTC 2020

Modified Files:
        src/lib/libc/stdlib: jemalloc.c

Log Message:
Fix atfork malloc handling to include all the locks in old jemalloc.


To generate a diff of this commit:
cvs rdiff -u -r1.47 -r1.48 src/lib/libc/stdlib/jemalloc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libc/stdlib/jemalloc.c
diff -u src/lib/libc/stdlib/jemalloc.c:1.47 src/lib/libc/stdlib/jemalloc.c:1.48
--- src/lib/libc/stdlib/jemalloc.c:1.47	Mon Jan 13 19:14:02 2020
+++ src/lib/libc/stdlib/jemalloc.c	Mon Jan 13 19:14:37 2020
@@ -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 <[email protected]>.
@@ -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);
 }
 
 /*

Reply via email to