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 28aa140d6702bb61c55dab49ae3be6c196078b94..6f15a04cfa4c14a6ef0e45de170dc8001d231188 100644 |
--- a/base/trace_event/malloc_dump_provider.cc |
+++ b/base/trace_event/malloc_dump_provider.cc |
@@ -6,6 +6,7 @@ |
#include <malloc.h> |
+#include "base/allocator/allocator_extension_thunks.h" |
#include "base/trace_event/process_memory_dump.h" |
namespace base { |
@@ -30,23 +31,55 @@ MallocDumpProvider::~MallocDumpProvider() { |
// the current process. |
bool MallocDumpProvider::OnMemoryDump(const MemoryDumpArgs& args, |
ProcessMemoryDump* pmd) { |
- struct mallinfo info = mallinfo(); |
- DCHECK_GE(info.arena + info.hblkhd, info.uordblks); |
- |
- // When the system allocator is implemented by tcmalloc, the total heap |
- // size is given by |arena| and |hblkhd| is 0. In case of Android's jemalloc |
- // |arena| is 0 and the outer pages size is reported by |hblkhd|. In case of |
- // dlmalloc the total is given by |arena| + |hblkhd|. |
- // For more details see link: http://goo.gl/fMR8lF. |
+ size_t total_virtual_size = 0; |
+ size_t resident_size = 0; |
+ size_t allocated_objects_size = 0; |
+ |
+ allocator::thunks::GetNumericPropertyFunction get_property_function = |
+ allocator::thunks::GetGetNumericPropertyFunction(); |
+ if (get_property_function) { |
+ // If the function is not null then tcmalloc is used. See |
+ // MallocExtension::getNumericProperty. |
+ size_t pageheap_unmapped_bytes = 0; |
+ bool res = get_property_function("generic.heap_size", &total_virtual_size); |
+ DCHECK(res); |
+ res = get_property_function("tcmalloc.pageheap_unmapped_bytes", |
+ &pageheap_unmapped_bytes); |
+ DCHECK(res); |
+ res = get_property_function("generic.current_allocated_bytes", |
+ &allocated_objects_size); |
+ DCHECK(res); |
+ |
+ // Please see TCMallocImplementation::GetStats implementation for |
+ // explanation |
+ // about this math. |
+ // TODO(ssid): Usage of metadata is not included in page heap bytes |
+ // (crbug.com/546491). MallocExtension::GetNumericProperty will be extended |
+ // to get this value. |
+ resident_size = total_virtual_size - pageheap_unmapped_bytes; |
+ } else { |
+ struct mallinfo info = mallinfo(); |
+ DCHECK_GE(info.arena + info.hblkhd, info.uordblks); |
+ |
+ // In case of Android's jemalloc |arena| is 0 and the outer pages size is |
+ // reported by |hblkhd|. In case of dlmalloc the total is given by |
+ // |arena| + |hblkhd|. For more details see link: http://goo.gl/fMR8lF. |
+ total_virtual_size = info.arena + info.hblkhd; |
+ resident_size = info.uordblks; |
+ allocated_objects_size = info.uordblks; |
+ } |
+ |
MemoryAllocatorDump* outer_dump = pmd->CreateAllocatorDump("malloc"); |
- outer_dump->AddScalar("virtual_size", |
- MemoryAllocatorDump::kUnitsBytes, |
- info.arena + info.hblkhd); |
+ outer_dump->AddScalar("virtual_size", MemoryAllocatorDump::kUnitsBytes, |
+ total_virtual_size); |
+ outer_dump->AddScalar(MemoryAllocatorDump::kNameSize, |
+ MemoryAllocatorDump::kUnitsBytes, resident_size); |
// Total allocated space is given by |uordblks|. |
MemoryAllocatorDump* inner_dump = pmd->CreateAllocatorDump(kAllocatedObjects); |
inner_dump->AddScalar(MemoryAllocatorDump::kNameSize, |
- MemoryAllocatorDump::kUnitsBytes, info.uordblks); |
+ MemoryAllocatorDump::kUnitsBytes, |
+ allocated_objects_size); |
return true; |
} |