diff options
| author | joerg <joerg@NetBSD.org> | 2020-05-15 14:37:21 +0000 |
|---|---|---|
| committer | joerg <joerg@NetBSD.org> | 2020-05-15 14:37:21 +0000 |
| commit | 710d485208e684d8f5c043845f76eb124922adbf (patch) | |
| tree | 372c131c9b9b3185d20d2492301d30e169441c9f /lib/libc/stdlib | |
| parent | 60358aead401bb6df79f957ec2c9105566d91083 (diff) | |
Hook up proper fork lock handling for malloc:
- lock all relevant mutexes just before fork
- unlock all mutexes just after fork in the parent
- full reinit non-spinlocks in the child
This is not using the normal pthread_atfork interface to ensure order of
operation, malloc is used as implementation detail too often.
Diffstat (limited to 'lib/libc/stdlib')
| -rw-r--r-- | lib/libc/stdlib/jemalloc.c | 24 | ||||
| -rw-r--r-- | lib/libc/stdlib/malloc.c | 11 |
2 files changed, 31 insertions, 4 deletions
diff --git a/lib/libc/stdlib/jemalloc.c b/lib/libc/stdlib/jemalloc.c index 236e6c86370..7e8f416f8ef 100644 --- a/lib/libc/stdlib/jemalloc.c +++ b/lib/libc/stdlib/jemalloc.c @@ -1,4 +1,4 @@ -/* $NetBSD: jemalloc.c,v 1.52 2020/05/03 07:32:54 mrg Exp $ */ +/* $NetBSD: jemalloc.c,v 1.53 2020/05/15 14:37:21 joerg Exp $ */ /*- * Copyright (C) 2006,2007 Jason Evans <jasone@FreeBSD.org>. @@ -117,7 +117,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.52 2020/05/03 07:32:54 mrg Exp $"); +__RCSID("$NetBSD: jemalloc.c,v 1.53 2020/05/15 14:37:21 joerg Exp $"); #ifdef __FreeBSD__ #include "libc_private.h" @@ -4027,6 +4027,26 @@ _malloc_postfork(void) malloc_mutex_unlock(&init_lock); } +void +_malloc_postfork_child(void) +{ + unsigned i; + + /* Release all mutexes, now that fork() has completed. */ +#ifdef USE_BRK + malloc_mutex_init(&brk_mtx); +#endif + malloc_mutex_init(&base_mtx); + malloc_mutex_init(&chunks_mtx); + + for (i = narenas; i-- > 0; ) { + if (arenas[i] != NULL) + malloc_mutex_init(&arenas[i]->mtx); + } + malloc_mutex_init(&arenas_mtx); + malloc_mutex_init(&init_lock); +} + /* * End library-private functions. */ diff --git a/lib/libc/stdlib/malloc.c b/lib/libc/stdlib/malloc.c index af37214d971..1b42569069e 100644 --- a/lib/libc/stdlib/malloc.c +++ b/lib/libc/stdlib/malloc.c @@ -1,4 +1,4 @@ -/* $NetBSD: malloc.c,v 1.59 2017/01/13 04:18:54 christos Exp $ */ +/* $NetBSD: malloc.c,v 1.60 2020/05/15 14:37:21 joerg Exp $ */ /* * ---------------------------------------------------------------------------- @@ -93,7 +93,7 @@ int utrace(const char *, void *, size_t); # include <sys/cdefs.h> # include "extern.h" # if defined(LIBC_SCCS) && !defined(lint) -__RCSID("$NetBSD: malloc.c,v 1.59 2017/01/13 04:18:54 christos Exp $"); +__RCSID("$NetBSD: malloc.c,v 1.60 2020/05/15 14:37:21 joerg Exp $"); # endif /* LIBC_SCCS and not lint */ # include <reentrant.h> # ifdef _REENTRANT @@ -1296,3 +1296,10 @@ _malloc_postfork(void) _MALLOC_UNLOCK(); } + +void +_malloc_postfork_child(void) +{ + + _MALLOC_UNLOCK(); +} |
