Chromium Code Reviews| Index: base/trace_event/malloc_dump_provider.cc |
| diff --git a/base/trace_event/malloc_dump_provider.cc b/base/trace_event/malloc_dump_provider.cc |
| index 7b3831c08d64a723d3773ba754708a3121c69e49..0e37293eac0894b84c59e8a0bba07ac487f6df89 100644 |
| --- a/base/trace_event/malloc_dump_provider.cc |
| +++ b/base/trace_event/malloc_dump_provider.cc |
| @@ -14,9 +14,9 @@ |
| #include "base/debug/profiler.h" |
| #include "base/trace_event/heap_profiler_allocation_context.h" |
| #include "base/trace_event/heap_profiler_allocation_context_tracker.h" |
| -#include "base/trace_event/heap_profiler_allocation_register.h" |
| #include "base/trace_event/heap_profiler_heap_dump_writer.h" |
| #include "base/trace_event/process_memory_dump.h" |
| +#include "base/trace_event/sharded_allocation_register.h" |
| #include "base/trace_event/trace_event_argument.h" |
| #include "build/build_config.h" |
| @@ -190,7 +190,8 @@ MallocDumpProvider* MallocDumpProvider::GetInstance() { |
| } |
| MallocDumpProvider::MallocDumpProvider() |
| - : heap_profiler_enabled_(false), tid_dumping_heap_(kInvalidThreadId) {} |
| + : allocation_register_(new ShardedAllocationRegister), |
| + tid_dumping_heap_(kInvalidThreadId) {} |
| MallocDumpProvider::~MallocDumpProvider() {} |
| @@ -286,7 +287,7 @@ bool MallocDumpProvider::OnMemoryDump(const MemoryDumpArgs& args, |
| } |
| // Heap profiler dumps. |
| - if (!heap_profiler_enabled_) |
| + if (!allocation_register_->IsEnabled()) |
| return true; |
| // The dumps of the heap profiler should be created only when heap profiling |
| @@ -304,18 +305,14 @@ bool MallocDumpProvider::OnMemoryDump(const MemoryDumpArgs& args, |
| TraceEventMemoryOverhead overhead; |
| std::unordered_map<AllocationContext, AllocationMetrics> metrics_by_context; |
| { |
|
Primiano Tucci (use gerrit)
2017/05/22 16:37:50
at this point this {} scope delimiter is not neede
erikchen
2017/05/22 17:10:42
Done.
|
| - AutoLock lock(allocation_register_lock_); |
| if (allocation_register_) { |
|
Primiano Tucci (use gerrit)
2017/05/22 16:37:50
this condition is always going to evaluate to true
erikchen
2017/05/22 17:10:42
The condition ins already checked on line 290. Rem
|
| if (args.level_of_detail == MemoryDumpLevelOfDetail::DETAILED) { |
| - for (const auto& alloc_size : *allocation_register_) { |
| - AllocationMetrics& metrics = metrics_by_context[alloc_size.context]; |
| - metrics.size += alloc_size.size; |
| - metrics.count++; |
| - |
| - // Aggregate data for objects allocated through the shim. |
| - shim_allocated_objects_size += alloc_size.size; |
| - shim_allocated_objects_count++; |
| - } |
| + ShardedAllocationRegister::OutputMetrics metrics = |
| + allocation_register_->UpdateAndReturnsMetrics(metrics_by_context); |
| + |
| + // Aggregate data for objects allocated through the shim. |
| + shim_allocated_objects_size += metrics.size; |
| + shim_allocated_objects_count += metrics.count; |
| } |
| allocation_register_->EstimateTraceMemoryOverhead(&overhead); |
| } |
| @@ -326,7 +323,7 @@ bool MallocDumpProvider::OnMemoryDump(const MemoryDumpArgs& args, |
| inner_dump->AddScalar("shim_allocator_object_count", |
| MemoryAllocatorDump::kUnitsObjects, |
| shim_allocated_objects_count); |
| - } // lock(allocation_register_lock_) |
| + } |
| pmd->DumpHeapUsage(metrics_by_context, overhead, "malloc"); |
| } |
| tid_dumping_heap_ = kInvalidThreadId; |
| @@ -337,20 +334,15 @@ bool MallocDumpProvider::OnMemoryDump(const MemoryDumpArgs& args, |
| void MallocDumpProvider::OnHeapProfilingEnabled(bool enabled) { |
| #if BUILDFLAG(USE_EXPERIMENTAL_ALLOCATOR_SHIM) |
| if (enabled) { |
| - { |
| - AutoLock lock(allocation_register_lock_); |
| - allocation_register_.reset(new AllocationRegister()); |
| - } |
| + if (!allocation_register_->IsInitialized()) |
|
Primiano Tucci (use gerrit)
2017/05/22 16:37:50
just call Initialize and early out in its implemen
erikchen
2017/05/22 17:10:42
Done.
|
| + allocation_register_->Initialize(); |
| allocator::InsertAllocatorDispatch(&g_allocator_hooks); |
| } else { |
| - AutoLock lock(allocation_register_lock_); |
| - allocation_register_.reset(); |
| - // Insert/RemoveAllocation below will no-op if the register is torn down. |
| - // Once disabled, heap profiling will not re-enabled anymore for the |
| - // lifetime of the process. |
| + // Once we enable heap profiling, we never remove the structures from |
| + // memory. |
| } |
| #endif |
| - heap_profiler_enabled_ = enabled; |
| + allocation_register_->SetEnabled(enabled); |
| } |
| void MallocDumpProvider::InsertAllocation(void* address, size_t size) { |
| @@ -372,8 +364,7 @@ void MallocDumpProvider::InsertAllocation(void* address, size_t size) { |
| if (!tracker->GetContextSnapshot(&context)) |
| return; |
| - AutoLock lock(allocation_register_lock_); |
| - if (!allocation_register_) |
| + if (!allocation_register_->IsEnabled()) |
| return; |
| allocation_register_->Insert(address, size, context); |
| @@ -385,8 +376,7 @@ void MallocDumpProvider::RemoveAllocation(void* address) { |
| if (tid_dumping_heap_ != kInvalidThreadId && |
| tid_dumping_heap_ == PlatformThread::CurrentId()) |
| return; |
| - AutoLock lock(allocation_register_lock_); |
| - if (!allocation_register_) |
| + if (!allocation_register_->IsEnabled()) |
| return; |
| allocation_register_->Remove(address); |
| } |