| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/trace_event/malloc_dump_provider.h" | 5 #include "base/trace_event/malloc_dump_provider.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <unordered_map> | 9 #include <unordered_map> |
| 10 | 10 |
| (...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 if (!heap_profiler_enabled_) | 287 if (!heap_profiler_enabled_) |
| 288 return true; | 288 return true; |
| 289 | 289 |
| 290 // The dumps of the heap profiler should be created only when heap profiling | 290 // The dumps of the heap profiler should be created only when heap profiling |
| 291 // was enabled (--enable-heap-profiling) AND a DETAILED dump is requested. | 291 // was enabled (--enable-heap-profiling) AND a DETAILED dump is requested. |
| 292 // However, when enabled, the overhead of the heap profiler should be always | 292 // However, when enabled, the overhead of the heap profiler should be always |
| 293 // reported to avoid oscillations of the malloc total in LIGHT dumps. | 293 // reported to avoid oscillations of the malloc total in LIGHT dumps. |
| 294 | 294 |
| 295 tid_dumping_heap_ = PlatformThread::CurrentId(); | 295 tid_dumping_heap_ = PlatformThread::CurrentId(); |
| 296 // At this point the Insert/RemoveAllocation hooks will ignore this thread. | 296 // At this point the Insert/RemoveAllocation hooks will ignore this thread. |
| 297 // Enclosing all the temporariy data structures in a scope, so that the heap | 297 // Enclosing all the temporary data structures in a scope, so that the heap |
| 298 // profiler does not see unabalanced malloc/free calls from these containers. | 298 // profiler does not see unbalanced malloc/free calls from these containers. |
| 299 { | 299 { |
| 300 size_t shim_allocated_objects_size = 0; |
| 301 size_t shim_allocated_objects_count = 0; |
| 300 TraceEventMemoryOverhead overhead; | 302 TraceEventMemoryOverhead overhead; |
| 301 std::unordered_map<AllocationContext, AllocationMetrics> metrics_by_context; | 303 std::unordered_map<AllocationContext, AllocationMetrics> metrics_by_context; |
| 302 { | 304 { |
| 303 AutoLock lock(allocation_register_lock_); | 305 AutoLock lock(allocation_register_lock_); |
| 304 if (allocation_register_) { | 306 if (allocation_register_) { |
| 305 if (args.level_of_detail == MemoryDumpLevelOfDetail::DETAILED) { | 307 if (args.level_of_detail == MemoryDumpLevelOfDetail::DETAILED) { |
| 306 for (const auto& alloc_size : *allocation_register_) { | 308 for (const auto& alloc_size : *allocation_register_) { |
| 307 AllocationMetrics& metrics = metrics_by_context[alloc_size.context]; | 309 AllocationMetrics& metrics = metrics_by_context[alloc_size.context]; |
| 308 metrics.size += alloc_size.size; | 310 metrics.size += alloc_size.size; |
| 309 metrics.count++; | 311 metrics.count++; |
| 312 |
| 313 // Aggregate data for objects allocated through the shim. |
| 314 shim_allocated_objects_size += alloc_size.size; |
| 315 shim_allocated_objects_count++; |
| 310 } | 316 } |
| 311 } | 317 } |
| 312 allocation_register_->EstimateTraceMemoryOverhead(&overhead); | 318 allocation_register_->EstimateTraceMemoryOverhead(&overhead); |
| 313 } | 319 } |
| 320 |
| 321 inner_dump->AddScalar("shim_allocated_objects_size", |
| 322 MemoryAllocatorDump::kUnitsBytes, |
| 323 shim_allocated_objects_size); |
| 324 inner_dump->AddScalar("shim_allocator_object_count", |
| 325 MemoryAllocatorDump::kUnitsObjects, |
| 326 shim_allocated_objects_count); |
| 314 } // lock(allocation_register_lock_) | 327 } // lock(allocation_register_lock_) |
| 315 pmd->DumpHeapUsage(metrics_by_context, overhead, "malloc"); | 328 pmd->DumpHeapUsage(metrics_by_context, overhead, "malloc"); |
| 316 } | 329 } |
| 317 tid_dumping_heap_ = kInvalidThreadId; | 330 tid_dumping_heap_ = kInvalidThreadId; |
| 318 | 331 |
| 319 return true; | 332 return true; |
| 320 } | 333 } |
| 321 | 334 |
| 322 void MallocDumpProvider::OnHeapProfilingEnabled(bool enabled) { | 335 void MallocDumpProvider::OnHeapProfilingEnabled(bool enabled) { |
| 323 #if BUILDFLAG(USE_EXPERIMENTAL_ALLOCATOR_SHIM) | 336 #if BUILDFLAG(USE_EXPERIMENTAL_ALLOCATOR_SHIM) |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 371 tid_dumping_heap_ == PlatformThread::CurrentId()) | 384 tid_dumping_heap_ == PlatformThread::CurrentId()) |
| 372 return; | 385 return; |
| 373 AutoLock lock(allocation_register_lock_); | 386 AutoLock lock(allocation_register_lock_); |
| 374 if (!allocation_register_) | 387 if (!allocation_register_) |
| 375 return; | 388 return; |
| 376 allocation_register_->Remove(address); | 389 allocation_register_->Remove(address); |
| 377 } | 390 } |
| 378 | 391 |
| 379 } // namespace trace_event | 392 } // namespace trace_event |
| 380 } // namespace base | 393 } // namespace base |
| OLD | NEW |