Index: base/allocator/allocator_shim.cc |
diff --git a/base/allocator/allocator_shim.cc b/base/allocator/allocator_shim.cc |
index bcc84aac984b25ffad8a97e7e3c52a2cdd42cc0a..01aff69dd16150ae08a92feeca74bc3c99873e56 100644 |
--- a/base/allocator/allocator_shim.cc |
+++ b/base/allocator/allocator_shim.cc |
@@ -232,42 +232,27 @@ extern "C" intptr_t _get_heap_handle() { |
return 0; |
} |
-static bool get_jemalloc_property_thunk(const char* name, size_t* value) { |
- jemalloc_stats_t stats; |
- jemalloc_stats(&stats); |
-#define EXTRACT_JEMALLOC_PROPERTY(property) \ |
- if (strcmp(name, "jemalloc." #property) == 0) \ |
- return *value = stats.property, true; |
- EXTRACT_JEMALLOC_PROPERTY(narenas); |
- EXTRACT_JEMALLOC_PROPERTY(balance_threshold); |
- EXTRACT_JEMALLOC_PROPERTY(quantum); |
- EXTRACT_JEMALLOC_PROPERTY(small_max); |
- EXTRACT_JEMALLOC_PROPERTY(large_max); |
- EXTRACT_JEMALLOC_PROPERTY(chunksize); |
- EXTRACT_JEMALLOC_PROPERTY(dirty_max); |
- EXTRACT_JEMALLOC_PROPERTY(reserve_min); |
- EXTRACT_JEMALLOC_PROPERTY(reserve_max); |
- EXTRACT_JEMALLOC_PROPERTY(mapped); |
- EXTRACT_JEMALLOC_PROPERTY(committed); |
- EXTRACT_JEMALLOC_PROPERTY(allocated); |
- EXTRACT_JEMALLOC_PROPERTY(dirty); |
- EXTRACT_JEMALLOC_PROPERTY(reserve_cur); |
-#undef EXTRACT_JEMALLOC_PROPERTY |
- return false; |
-} |
- |
-static bool get_property_thunk(const char* name, size_t* value) { |
+static bool get_allocator_waste_size_thunk(size_t* size) { |
#ifdef ENABLE_DYNAMIC_ALLOCATOR_SWITCHING |
switch (allocator) { |
case JEMALLOC: |
- return get_jemalloc_property_thunk(name, value); |
case WINHEAP: |
case WINLFH: |
- // TODO(alexeif): Implement for other allocators. |
+ // TODO(alexeif): Implement for allocators other than tcmalloc. |
return false; |
} |
#endif |
- return MallocExtension::instance()->GetNumericProperty(name, value); |
+ size_t heap_size, allocated_bytes, unmapped_bytes; |
+ MallocExtension* ext = MallocExtension::instance(); |
+ if (ext->GetNumericProperty("generic.heap_size", &heap_size) && |
+ ext->GetNumericProperty("generic.current_allocated_bytes", |
+ &allocated_bytes) && |
+ ext->GetNumericProperty("tcmalloc.pageheap_unmapped_bytes", |
+ &unmapped_bytes)) { |
+ *size = heap_size - allocated_bytes - unmapped_bytes; |
+ return true; |
+ } |
+ return false; |
} |
static void get_stats_thunk(char* buffer, int buffer_length) { |
@@ -323,7 +308,8 @@ extern "C" int _heap_init() { |
tracked_objects::TIME_SOURCE_TYPE_TCMALLOC); |
} |
- base::allocator::thunks::SetGetPropertyFunction(get_property_thunk); |
+ base::allocator::thunks::SetGetAllocatorWasteSizeFunction( |
+ get_allocator_waste_size_thunk); |
base::allocator::thunks::SetGetStatsFunction(get_stats_thunk); |
base::allocator::thunks::SetReleaseFreeMemoryFunction( |
release_free_memory_thunk); |