Index: lib/libc/gen/pthread_atfork.c =================================================================== RCS file: /cvsroot/src/lib/libc/gen/pthread_atfork.c,v retrieving revision 1.10 diff -u -r1.10 pthread_atfork.c --- lib/libc/gen/pthread_atfork.c 20 Jan 2015 18:31:25 -0000 1.10 +++ lib/libc/gen/pthread_atfork.c 1 Feb 2020 12:53:12 -0000 @@ -36,10 +36,12 @@ #include "namespace.h" +#include +#include +#include #include #include #include -#include #include "reentrant.h" #ifdef __weak_alias @@ -73,11 +75,15 @@ static struct atfork_callback * af_alloc(void) { + void *arena; if (atfork_builtin.fn == NULL) return &atfork_builtin; - return malloc(sizeof(atfork_builtin)); + arena = mmap(NULL, sizeof(atfork_builtin), PROT_READ|PROT_WRITE, MAP_ANON, -1, 0); + if (arena == MAP_FAILED) + return NULL; + return arena; } static void @@ -85,7 +91,7 @@ { if (af != &atfork_builtin) - free(af); + munmap(af, sizeof(atfork_builtin)); } int Index: lib/libc/misc/initfini.c =================================================================== RCS file: /cvsroot/src/lib/libc/misc/initfini.c,v retrieving revision 1.14 diff -u -r1.14 initfini.c --- lib/libc/misc/initfini.c 17 Jun 2017 15:26:44 -0000 1.14 +++ lib/libc/misc/initfini.c 1 Feb 2020 12:53:12 -0000 @@ -43,11 +43,15 @@ void _libc_init(void) __attribute__((__constructor__, __used__)); + void __guard_setup(void); void __libc_thr_init(void); void __libc_atomic_init(void); void __libc_atexit_init(void); void __libc_env_init(void); +void __libc_malloc_init(void); + +__weak_alias(__libc_malloc_init,__libc_malloc_init_stub) #if defined(__HAVE_TLS_VARIANT_I) || defined(__HAVE_TLS_VARIANT_II) __dso_hidden void __libc_static_tls_setup(void); @@ -132,4 +136,16 @@ /* Initialize environment memory RB tree. */ __libc_env_init(); + + /* Initialize the malloc library */ + __libc_malloc_init(); +} + +void __libc_malloc_init_stub(void); + +void __section(".text.startup") +__libc_malloc_init_stub(void) +{ + + /* nothing, maybe be overriden by a mutex library */ } Index: lib/libpthread/pthread_mutex.c =================================================================== RCS file: /cvsroot/src/lib/libpthread/pthread_mutex.c,v retrieving revision 1.72 diff -u -r1.72 pthread_mutex.c --- lib/libpthread/pthread_mutex.c 31 Jan 2020 17:52:14 -0000 1.72 +++ lib/libpthread/pthread_mutex.c 1 Feb 2020 12:53:12 -0000 @@ -122,14 +122,12 @@ { uintptr_t type, proto, val, ceil; -#if 0 /* * Always initialize the mutex structure, maybe be used later * and the cost should be minimal. */ if (__predict_false(__uselibcstub)) return __libc_mutex_init_stub(ptm, attr); -#endif pthread__error(EINVAL, "Invalid mutes attribute", attr == NULL || attr->ptma_magic == _PT_MUTEXATTR_MAGIC); @@ -619,10 +617,9 @@ int pthread_mutexattr_init(pthread_mutexattr_t *attr) { -#if 0 + if (__predict_false(__uselibcstub)) return __libc_mutexattr_init_stub(attr); -#endif attr->ptma_magic = _PT_MUTEXATTR_MAGIC; attr->ptma_private = (void *)PTHREAD_MUTEX_DEFAULT; Index: external/bsd/jemalloc/dist/src/jemalloc.c =================================================================== RCS file: /cvsroot/src/external/bsd/jemalloc/dist/src/jemalloc.c,v retrieving revision 1.8 diff -u -r1.8 jemalloc.c --- external/bsd/jemalloc/dist/src/jemalloc.c 3 Oct 2019 16:10:23 -0000 1.8 +++ external/bsd/jemalloc/dist/src/jemalloc.c 1 Feb 2020 12:53:12 -0000 @@ -3200,6 +3200,15 @@ * malloc during fork(). */ +#if defined(__NetBSD__) +JEMALLOC_ATTR(visibility("default")) void jemalloc__init(void); +__strong_alias(__libc_malloc_init,jemalloc__init) +void +jemalloc__init(void) +{ + malloc_init(); +} +#else /* * If an application creates a thread before doing any allocation in the main * thread, then calls fork(2) in the main thread followed by memory allocation @@ -3220,6 +3229,7 @@ malloc_init(); } #endif +#endif #ifndef JEMALLOC_MUTEX_INIT_CB void