Index: base/allocator/allocator_extension.cc |
diff --git a/base/allocator/allocator_extension.cc b/base/allocator/allocator_extension.cc |
index 17682f85d4950acd837f268056afa3ae49fc43c2..9a3d114f7290db53eb1b203a7d6309f8af7a9734 100644 |
--- a/base/allocator/allocator_extension.cc |
+++ b/base/allocator/allocator_extension.cc |
@@ -9,6 +9,7 @@ |
#if defined(USE_TCMALLOC) |
#include "third_party/tcmalloc/chromium/src/gperftools/heap-profiler.h" |
#include "third_party/tcmalloc/chromium/src/gperftools/malloc_extension.h" |
+#include "third_party/tcmalloc/chromium/src/gperftools/malloc_hook.h" |
#endif |
namespace base { |
@@ -34,5 +35,26 @@ bool IsHeapProfilerRunning() { |
return false; |
} |
+void SetHooks(AllocHookFunc alloc_hook, FreeHookFunc free_hook) { |
+// TODO(sque): Use allocator shim layer instead. |
+#if defined(USE_TCMALLOC) |
+ // Make sure no hooks get overwritten. |
+ auto prev_alloc_hook = MallocHook::SetNewHook(alloc_hook); |
+ if (alloc_hook) |
+ DCHECK(!prev_alloc_hook); |
+ |
+ auto prev_free_hook = MallocHook::SetDeleteHook(free_hook); |
+ if (free_hook) |
+ DCHECK(!prev_free_hook); |
+#endif |
+} |
+ |
+int GetCallStack(void** stack, int max_stack_size) { |
+#if defined(USE_TCMALLOC) |
+ return MallocHook::GetCallerStackTrace(stack, max_stack_size, 0); |
+#endif |
+ return 0; |
+} |
+ |
} // namespace allocator |
} // namespace base |