From 96918b9811a81aec1bc2aaee34a0db88044994ee Mon Sep 17 00:00:00 2001 From: deischen Date: Tue, 4 Nov 2003 19:49:56 +0000 Subject: [PATCH] Externalize malloc's spinlock so that a thread library can take it around an application's fork() call. Our new thread libraries (libthr, libpthread) can now have threads running while another thread calls fork(). In this case, it is possible for malloc to be left in an inconsistent state in the child. Our thread libraries, libpthread in particular, need to use malloc internally after a fork (in the child). Reviewed by: davidxu --- lib/libc/include/libc_private.h | 8 ++++++++ lib/libc/stdlib/malloc.c | 1 + 2 files changed, 9 insertions(+) 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__ */