Index: base/allocator/allocator_extension.cc |
diff --git a/base/allocator/allocator_extension.cc b/base/allocator/allocator_extension.cc |
index 17682f85d4950acd837f268056afa3ae49fc43c2..a8dbdb236f356dbc6dd6442575f0a6be8d15e3a8 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,56 @@ bool IsHeapProfilerRunning() { |
return false; |
} |
+AllocHookFunc SetSingleAllocHook(AllocHookFunc func) { |
Primiano Tucci (use gerrit)
2016/03/01 18:54:36
What I would do here is:
1) Have just a Set functi
|
+#if defined(USE_TCMALLOC) |
+ return MallocHook::SetNewHook(func); |
+#endif |
+ return nullptr; |
+} |
+ |
+FreeHookFunc SetSingleFreeHook(FreeHookFunc func) { |
+#if defined(USE_TCMALLOC) |
+ return MallocHook::SetDeleteHook(func); |
+#endif |
+ return nullptr; |
+} |
+ |
+AllocHookFunc GetSingleAllocHook() { |
+#if defined(USE_TCMALLOC) |
+ // Due to the way things are implemented in tcmalloc's |
+ // gperftools/malloc_hook.h, MallocHook::GetNewHook() cannot be called. |
+ // Instead, overwrite the stored callback with nullptr and get the stored |
+ // callback as a return value from SetNewHook(). Then write it back as the |
+ // stored value. Same goes for GetSingleFreeHook(). |
+ // |
+ // This implementation should not have too much overhead as long as |
+ // MallocHook's deprecated hook registration functions are trivial. |
+ AllocHookFunc existing_hook = MallocHook::SetNewHook(nullptr); |
+ MallocHook::SetNewHook(existing_hook); |
+ return existing_hook; |
+#endif |
+ return nullptr; |
+} |
+ |
+FreeHookFunc GetSingleFreeHook() { |
+#if defined(USE_TCMALLOC) |
+ FreeHookFunc existing_hook = MallocHook::SetDeleteHook(nullptr); |
+ MallocHook::SetDeleteHook(existing_hook); |
+ return existing_hook; |
+#endif |
+ return nullptr; |
+} |
+ |
+int GetCallStack(void** stack, int max_stack_size, int /* skip_count */) { |
+#if defined(USE_TCMALLOC) |
+ // |skip_count| is not used by the following function. Instead, the number of |
+ // frames to skip is determined internally. |
Primiano Tucci (use gerrit)
2016/03/01 18:54:36
so why not omitting the skip_count argument at all
|
+ // See MallocHook_GetCallerStackTrace() in |
+ // third_party/tcmalloc/chromium/src/malloc_hook.cc. |
+ return MallocHook::GetCallerStackTrace(stack, max_stack_size, 0); |
+#endif |
+ return 0; |
+} |
+ |
} // namespace allocator |
} // namespace base |