| 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
|
|
|