Index: third_party/tcmalloc/vendor/src/libc_override_osx.h |
diff --git a/third_party/tcmalloc/vendor/src/libc_override_osx.h b/third_party/tcmalloc/vendor/src/libc_override_osx.h |
index 0ccf9a31d2d392d96813b3eba6da0c0fc8eb30e8..78a0ef2f95974b4d02e75dceaa716f75592d1e0a 100644 |
--- a/third_party/tcmalloc/vendor/src/libc_override_osx.h |
+++ b/third_party/tcmalloc/vendor/src/libc_override_osx.h |
@@ -75,7 +75,7 @@ |
#ifdef HAVE_FEATURES_H |
#include <features.h> |
#endif |
-#include <google/tcmalloc.h> |
+#include <gperftools/tcmalloc.h> |
#if !defined(__APPLE__) |
# error libc_override_glibc-osx.h is for OS X distributions only. |
@@ -84,6 +84,19 @@ |
#include <AvailabilityMacros.h> |
#include <malloc/malloc.h> |
+// from AvailabilityMacros.h |
+#if defined(MAC_OS_X_VERSION_10_6) && \ |
+ MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 |
+extern "C" { |
+ // This function is only available on 10.6 (and later) but the |
+ // LibSystem headers do not use AvailabilityMacros.h to handle weak |
+ // importing automatically. This prototype is a copy of the one in |
+ // <malloc/malloc.h> with the WEAK_IMPORT_ATTRBIUTE added. |
+ extern malloc_zone_t *malloc_default_purgeable_zone(void) |
+ WEAK_IMPORT_ATTRIBUTE; |
+} |
+#endif |
+ |
// We need to provide wrappers around all the libc functions. |
namespace { |
size_t mz_size(malloc_zone_t* zone, const void* ptr) { |
@@ -235,8 +248,13 @@ static void ReplaceSystemAlloc() { |
// doing tiny and small allocs. Sadly, it assumes that the default |
// zone is the szone implementation from OS X and will crash if it |
// isn't. By creating the zone now, this will be true and changing |
- // the default zone won't cause a problem. (OS X 10.6 and higher.) |
- malloc_default_purgeable_zone(); |
+ // the default zone won't cause a problem. This only needs to |
+ // happen when actually running on OS X 10.6 and higher (note the |
+ // ifdef above only checks if we were *compiled* with 10.6 or |
+ // higher; at runtime we have to check if this symbol is defined.) |
+ if (malloc_default_purgeable_zone) { |
+ malloc_default_purgeable_zone(); |
+ } |
#endif |
// Register the tcmalloc zone. At this point, it will not be the |