Chromium Code Reviews| Index: base/trace_event/memory_profiler_allocation_context.cc |
| diff --git a/base/trace_event/memory_profiler_allocation_context.cc b/base/trace_event/memory_profiler_allocation_context.cc |
| index 1f3ea06c857f501630539a446e666acd53f426ff..5fdfd73f5db4f6e7ce358973a2c3b9e5a220ce72 100644 |
| --- a/base/trace_event/memory_profiler_allocation_context.cc |
| +++ b/base/trace_event/memory_profiler_allocation_context.cc |
| @@ -5,7 +5,9 @@ |
| #include "base/trace_event/memory_profiler_allocation_context.h" |
| #include <algorithm> |
| +#include <cstring> |
| +#include "base/hash.h" |
| #include "base/threading/thread_local_storage.h" |
| namespace base { |
| @@ -20,22 +22,10 @@ ThreadLocalStorage::StaticSlot g_tls_alloc_ctx_tracker = TLS_INITIALIZER; |
| AllocationStack::AllocationStack() {} |
| AllocationStack::~AllocationStack() {} |
| -// This function is added to the TLS slot to clean up the instance when the |
| -// thread exits. |
| -void DestructAllocationContextTracker(void* alloc_ctx_tracker) { |
| - delete static_cast<AllocationContextTracker*>(alloc_ctx_tracker); |
| -} |
| - |
| -AllocationContextTracker* AllocationContextTracker::GetThreadLocalTracker() { |
| - auto tracker = |
| - static_cast<AllocationContextTracker*>(g_tls_alloc_ctx_tracker.Get()); |
| - |
| - if (!tracker) { |
| - tracker = new AllocationContextTracker(); |
| - g_tls_alloc_ctx_tracker.Set(tracker); |
| - } |
| - |
| - return tracker; |
| +bool operator==(const Backtrace& lhs, const Backtrace& rhs) { |
| + // Pointer equality of the stack frames is assumed, so instead of doing a deep |
| + // string comparison on all of the frames, a |memcmp| suffices. |
| + return std::memcmp(lhs.frames, rhs.frames, sizeof(lhs.frames)) == 0; |
| } |
| StackFrameDeduplicator::FrameNode::FrameNode(StackFrame frame, |
| @@ -46,7 +36,7 @@ StackFrameDeduplicator::FrameNode::~FrameNode() {} |
| StackFrameDeduplicator::StackFrameDeduplicator() {} |
| StackFrameDeduplicator::~StackFrameDeduplicator() {} |
| -int StackFrameDeduplicator::Insert(const AllocationContext::Backtrace& bt) { |
| +int StackFrameDeduplicator::Insert(const Backtrace& bt) { |
| int frame_index = -1; |
| std::map<StackFrame, int>* nodes = &roots_; |
| @@ -81,6 +71,24 @@ int StackFrameDeduplicator::Insert(const AllocationContext::Backtrace& bt) { |
| return frame_index; |
| } |
| +// This function is added to the TLS slot to clean up the instance when the |
| +// thread exits. |
| +void DestructAllocationContextTracker(void* alloc_ctx_tracker) { |
|
Primiano Tucci (use gerrit)
2015/10/27 11:56:20
This should be moved perhaps in the anonymous name
Ruud van Asseldonk
2015/10/27 11:59:31
Can do when refactoring, other CLs touch this piec
|
| + delete static_cast<AllocationContextTracker*>(alloc_ctx_tracker); |
| +} |
| + |
| +AllocationContextTracker* AllocationContextTracker::GetThreadLocalTracker() { |
| + auto tracker = |
| + static_cast<AllocationContextTracker*>(g_tls_alloc_ctx_tracker.Get()); |
| + |
| + if (!tracker) { |
| + tracker = new AllocationContextTracker(); |
| + g_tls_alloc_ctx_tracker.Set(tracker); |
| + } |
| + |
| + return tracker; |
| +} |
| + |
| AllocationContextTracker::AllocationContextTracker() {} |
| AllocationContextTracker::~AllocationContextTracker() {} |
| @@ -173,3 +181,13 @@ AllocationContext AllocationContextTracker::GetContextSnapshot() { |
| } // namespace trace_event |
| } // namespace base |
| + |
| +namespace BASE_HASH_NAMESPACE { |
| +using base::trace_event::Backtrace; |
| + |
| +uint32_t hash<Backtrace>::operator()(const Backtrace& backtrace) const { |
| + return base::SuperFastHash(reinterpret_cast<const char*>(backtrace.frames), |
| + sizeof(backtrace.frames)); |
| +} |
| + |
| +} // BASE_HASH_NAMESPACE |