Index: base/allocator/allocator_shim.cc |
diff --git a/base/allocator/allocator_shim.cc b/base/allocator/allocator_shim.cc |
index 1d8229117d77a27035c84a33523b230eea7a3351..9b3b50c4ee4ca82350ad2c3d2fd69a7064608fed 100644 |
--- a/base/allocator/allocator_shim.cc |
+++ b/base/allocator/allocator_shim.cc |
@@ -10,11 +10,9 @@ |
#include "base/sysinfo.h" |
#include "jemalloc.h" |
-// When defined, different heap allocators can be used via an environment |
-// variable set before running the program. This may reduce the amount |
-// of inlining that we get with malloc/free/etc. Disabling makes it |
-// so that only tcmalloc can be used. |
-#define ENABLE_DYNAMIC_ALLOCATOR_SWITCHING |
+// This shim make it possible to use different allocators via an environment |
+// variable set before running the program. This may reduce the |
+// amount of inlining that we get with malloc/free/etc. |
// TODO(mbelshe): Ensure that all calls to tcmalloc have the proper call depth |
// from the "user code" so that debugging tools (HeapChecker) can work. |
@@ -119,7 +117,6 @@ extern "C" { |
void* malloc(size_t size) __THROW { |
void* ptr; |
for (;;) { |
-#ifdef ENABLE_DYNAMIC_ALLOCATOR_SWITCHING |
switch (allocator) { |
case JEMALLOC: |
ptr = je_malloc(size); |
@@ -133,10 +130,6 @@ void* malloc(size_t size) __THROW { |
ptr = do_malloc(size); |
break; |
} |
-#else |
- // TCMalloc case. |
- ptr = do_malloc(size); |
-#endif |
if (ptr) |
return ptr; |
@@ -147,7 +140,6 @@ void* malloc(size_t size) __THROW { |
} |
void free(void* p) __THROW { |
-#ifdef ENABLE_DYNAMIC_ALLOCATOR_SWITCHING |
switch (allocator) { |
case JEMALLOC: |
je_free(p); |
@@ -156,10 +148,10 @@ void free(void* p) __THROW { |
case WINLFH: |
win_heap_free(p); |
return; |
+ case TCMALLOC: |
+ do_free(p); |
+ return; |
} |
-#endif |
- // TCMalloc case. |
- do_free(p); |
} |
void* realloc(void* ptr, size_t size) __THROW { |
@@ -171,7 +163,6 @@ void* realloc(void* ptr, size_t size) __THROW { |
void* new_ptr; |
for (;;) { |
-#ifdef ENABLE_DYNAMIC_ALLOCATOR_SWITCHING |
switch (allocator) { |
case JEMALLOC: |
new_ptr = je_realloc(ptr, size); |
@@ -185,10 +176,6 @@ void* realloc(void* ptr, size_t size) __THROW { |
new_ptr = do_realloc(ptr, size); |
break; |
} |
-#else |
- // TCMalloc case. |
- new_ptr = do_realloc(ptr, size); |
-#endif |
// Subtle warning: NULL return does not alwas indicate out-of-memory. If |
// the requested new size is zero, realloc should free the ptr and return |
@@ -203,7 +190,6 @@ void* realloc(void* ptr, size_t size) __THROW { |
// TODO(mbelshe): Implement this for other allocators. |
void malloc_stats(void) __THROW { |
-#ifdef ENABLE_DYNAMIC_ALLOCATOR_SWITCHING |
switch (allocator) { |
case JEMALLOC: |
// No stats. |
@@ -212,15 +198,15 @@ void malloc_stats(void) __THROW { |
case WINLFH: |
// No stats. |
return; |
+ case TCMALLOC: |
+ tc_malloc_stats(); |
+ return; |
} |
-#endif |
- tc_malloc_stats(); |
} |
#ifdef WIN32 |
extern "C" size_t _msize(void* p) { |
-#ifdef ENABLE_DYNAMIC_ALLOCATOR_SWITCHING |
switch (allocator) { |
case JEMALLOC: |
return je_msize(p); |
@@ -228,7 +214,8 @@ extern "C" size_t _msize(void* p) { |
case WINLFH: |
return win_heap_msize(p); |
} |
-#endif |
+ |
+ // TCMALLOC |
return MallocExtension::instance()->GetAllocatedSize(p); |
} |
@@ -238,7 +225,6 @@ extern "C" intptr_t _get_heap_handle() { |
} |
static bool get_allocator_waste_size_thunk(size_t* size) { |
-#ifdef ENABLE_DYNAMIC_ALLOCATOR_SWITCHING |
switch (allocator) { |
case JEMALLOC: |
case WINHEAP: |
@@ -246,7 +232,6 @@ static bool get_allocator_waste_size_thunk(size_t* size) { |
// TODO(alexeif): Implement for allocators other than tcmalloc. |
return false; |
} |
-#endif |
size_t heap_size, allocated_bytes, unmapped_bytes; |
MallocExtension* ext = MallocExtension::instance(); |
if (ext->GetNumericProperty("generic.heap_size", &heap_size) && |
@@ -270,7 +255,6 @@ static void release_free_memory_thunk() { |
// The CRT heap initialization stub. |
extern "C" int _heap_init() { |
-#ifdef ENABLE_DYNAMIC_ALLOCATOR_SWITCHING |
// Don't use the environment variable if ADDRESS_SANITIZER is defined on |
// Windows, as the implementation requires Winheap to be the allocator. |
#if !(defined(ADDRESS_SANITIZER) && defined(OS_WIN)) |
@@ -299,7 +283,7 @@ extern "C" int _heap_init() { |
// fall through |
break; |
} |
-#endif |
+ |
// Initializing tcmalloc. |
// We intentionally leak this object. It lasts for the process |
// lifetime. Trying to teardown at _heap_term() is so late that |
@@ -346,7 +330,6 @@ void* _aligned_malloc(size_t size, size_t alignment) { |
void* ptr; |
for (;;) { |
-#ifdef ENABLE_DYNAMIC_ALLOCATOR_SWITCHING |
switch (allocator) { |
case JEMALLOC: |
ptr = je_memalign(alignment, size); |
@@ -360,10 +343,7 @@ void* _aligned_malloc(size_t size, size_t alignment) { |
ptr = tc_memalign(alignment, size); |
break; |
} |
-#else |
- // TCMalloc case. |
- ptr = tc_memalign(alignment, size); |
-#endif |
+ |
if (ptr) { |
// Sanity check alignment. |
DCHECK_EQ(reinterpret_cast<uintptr_t>(ptr) & (alignment - 1), 0U); |
@@ -380,7 +360,6 @@ void _aligned_free(void* p) { |
// Both JEMalloc and TCMalloc return pointers from memalign() that are safe to |
// use with free(). Pointers allocated with win_heap_memalign() MUST be freed |
// via win_heap_memalign_free() since the aligned pointer is not the real one. |
-#ifdef ENABLE_DYNAMIC_ALLOCATOR_SWITCHING |
switch (allocator) { |
case JEMALLOC: |
je_free(p); |
@@ -389,10 +368,9 @@ void _aligned_free(void* p) { |
case WINLFH: |
win_heap_memalign_free(p); |
return; |
+ case TCMALLOC: |
+ do_free(p); |
} |
-#endif |
- // TCMalloc case. |
- do_free(p); |
} |
#endif // WIN32 |
@@ -405,7 +383,6 @@ namespace base { |
namespace allocator { |
void SetupSubprocessAllocator() { |
-#ifdef ENABLE_DYNAMIC_ALLOCATOR_SWITCHING |
size_t primary_length = 0; |
getenv_s(&primary_length, NULL, 0, primary_name); |
@@ -427,7 +404,6 @@ void SetupSubprocessAllocator() { |
int ret_val = _putenv_s(primary_name, secondary_value); |
DCHECK_EQ(0, ret_val); |
} |
-#endif // ENABLE_DYNAMIC_ALLOCATOR_SWITCHING |
} |
void* TCMallocDoMallocForTest(size_t size) { |