diff --git a/lib/libc/include/libc_private.h b/lib/libc/include/libc_private.h index f369cc7fe25c..d4265e9fcc1b 100644 --- a/lib/libc/include/libc_private.h +++ b/lib/libc/include/libc_private.h @@ -38,6 +38,8 @@ #ifndef _LIBC_PRIVATE_H_ #define _LIBC_PRIVATE_H_ +#include + /* * This global flag is non-zero when a process has created one * or more threads. It is used to avoid calling locking functions @@ -120,4 +122,10 @@ int _yp_check(char **); */ extern const char *__progname; +/* + * This is the lock to make malloc() thread-safe. It is externalized + * so that thread libraries can protect malloc across fork(). + */ +extern spinlock_t *__malloc_lock; + #endif /* _LIBC_PRIVATE_H_ */ diff --git a/lib/libc/stdlib/malloc.c b/lib/libc/stdlib/malloc.c index 7006df261e55..d99457abaa9a 100644 --- a/lib/libc/stdlib/malloc.c +++ b/lib/libc/stdlib/malloc.c @@ -74,6 +74,7 @@ __FBSDID("$FreeBSD$"); # include "libc_private.h" # include "spinlock.h" static spinlock_t thread_lock = _SPINLOCK_INITIALIZER; + spinlock_t *__malloc_lock = &thread_lock; # define _MALLOC_LOCK() if (__isthreaded) _SPINLOCK(&thread_lock); # define _MALLOC_UNLOCK() if (__isthreaded) _SPINUNLOCK(&thread_lock); #endif /* __FreeBSD__ */