Chromium Code Reviews| Index: third_party/tcmalloc/chromium/src/heap-profiler.cc |
| diff --git a/third_party/tcmalloc/chromium/src/heap-profiler.cc b/third_party/tcmalloc/chromium/src/heap-profiler.cc |
| index 0b07a5e8662da230e481839dcb5f62b521f9359d..a146bd4f42ec9c5bcd7b15a790acb20d69de4b3a 100644 |
| --- a/third_party/tcmalloc/chromium/src/heap-profiler.cc |
| +++ b/third_party/tcmalloc/chromium/src/heap-profiler.cc |
| @@ -222,6 +222,11 @@ static int64 last_dump_time = 0; // The time of the last dump |
| static HeapProfileTable* heap_profile = NULL; // the heap profile table |
| static DeepHeapProfile* deep_profile = NULL; // deep memory profiler |
| +// Callback to generate a stack trace for an allocation. May be overriden |
| +// by an application to provide its own pseudo-stacks. |
| +static StackGeneratorFunction stack_generator_function = |
| + &HeapProfileTable::GetCallerStackTrace; |
|
jar (doing other things)
2013/07/12 01:24:26
nit: no need for the ampersand.
James Cook
2013/07/12 17:40:27
Done.
|
| + |
| //---------------------------------------------------------------------- |
| // Profile generation |
| //---------------------------------------------------------------------- |
| @@ -374,7 +379,7 @@ static void MaybeDumpProfileLocked() { |
| static void RecordAlloc(const void* ptr, size_t bytes, int skip_count) { |
| // Take the stack trace outside the critical section. |
| void* stack[HeapProfileTable::kMaxStackDepth]; |
| - int depth = HeapProfileTable::GetCallerStackTrace(skip_count + 1, stack); |
| + int depth = (*stack_generator_function)(skip_count + 1, stack); |
|
jar (doing other things)
2013/07/12 01:24:26
nit: no need for the indirection or parens.
stack
James Cook
2013/07/12 17:40:27
Done. Apparently I have forgotten how to deal wit
|
| SpinLockHolder l(&heap_lock); |
| if (is_on) { |
| heap_profile->RecordAlloc(ptr, bytes, depth, stack); |
| @@ -542,7 +547,9 @@ extern "C" void HeapProfilerStart(const char* prefix) { |
| RAW_CHECK(MallocHook::AddDeleteHook(&DeleteHook), ""); |
| } |
| - // Copy filename prefix |
| + // Copy filename prefix only if provided. |
| + if (!prefix) |
| + return; |
| RAW_DCHECK(filename_prefix == NULL, ""); |
| const int prefix_length = strlen(prefix); |
| filename_prefix = reinterpret_cast<char*>(ProfilerMalloc(prefix_length + 1)); |
| @@ -550,6 +557,16 @@ extern "C" void HeapProfilerStart(const char* prefix) { |
| filename_prefix[prefix_length] = '\0'; |
| } |
| +extern "C" void HeapProfilerWithPseudoStackStart( |
| + StackGeneratorFunction callback) { |
| + { |
| + // Ensure the callback is set before allocations can be recorded. |
| + SpinLockHolder l(&heap_lock); |
| + stack_generator_function = callback; |
| + } |
| + HeapProfilerStart(NULL); |
| +} |
| + |
| extern "C" void IterateAllocatedObjects(AddressVisitor visitor, void* data) { |
| SpinLockHolder l(&heap_lock); |