blob: b8c96954c3d5ddfe9eb5e259971c29506cf3ac3b [file] [log] [blame]
commit 7013b219970a329d1db58fbd7fa7c907bec8dbba
Author: Aliaksey Kandratsenka <alk@tut.by>
Date: Sat May 9 12:48:11 2015 -0700
hook mi_force_{un,}lock on OSX instead of pthread_atfork
This is patch by Anton Samokhvalov.
Apparently it helps with locking around forking on OSX.
diff --git a/src/libc_override_osx.h b/src/libc_override_osx.h
index 26923e9..b801f22 100644
--- a/src/libc_override_osx.h
+++ b/src/libc_override_osx.h
@@ -85,6 +85,11 @@
#include <AvailabilityMacros.h>
#include <malloc/malloc.h>
+namespace tcmalloc {
+ void CentralCacheLockAll();
+ void CentralCacheUnlockAll();
+}
+
// from AvailabilityMacros.h
#if defined(MAC_OS_X_VERSION_10_6) && \
MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
@@ -169,11 +174,11 @@ void mi_log(malloc_zone_t *zone, void *address) {
}
void mi_force_lock(malloc_zone_t *zone) {
- // Hopefully unneeded by us!
+ tcmalloc::CentralCacheLockAll();
}
void mi_force_unlock(malloc_zone_t *zone) {
- // Hopefully unneeded by us!
+ tcmalloc::CentralCacheUnlockAll();
}
void mi_statistics(malloc_zone_t *zone, malloc_statistics_t *stats) {
diff --git a/src/static_vars.cc b/src/static_vars.cc
index 197b3a1..09d2b59 100644
--- a/src/static_vars.cc
+++ b/src/static_vars.cc
@@ -51,7 +51,6 @@ namespace tcmalloc {
// sure the central_cache locks remain in a consisten state in the forked
// version of the thread.
-static
void CentralCacheLockAll()
{
Static::pageheap_lock()->Lock();
@@ -59,7 +58,6 @@ void CentralCacheLockAll()
Static::central_cache()[i].Lock();
}
-static
void CentralCacheUnlockAll()
{
for (int i = 0; i < kNumClasses; ++i)
@@ -114,9 +112,11 @@ void Static::InitStaticVars() {
static inline
void SetupAtForkLocksHandler()
{
+#if !defined(__APPLE__)
pthread_atfork(CentralCacheLockAll, // parent calls before fork
CentralCacheUnlockAll, // parent calls after fork
CentralCacheUnlockAll); // child calls after fork
+#endif
}
REGISTER_MODULE_INITIALIZER(tcmalloc_fork_handler, SetupAtForkLocksHandler());