| Index: base/allocator/allocator_shim.cc
|
| diff --git a/base/allocator/allocator_shim.cc b/base/allocator/allocator_shim.cc
|
| index 9d3d932d59f2e80787a62c4c2af1565bfe43a2f4..bcc84aac984b25ffad8a97e7e3c52a2cdd42cc0a 100644
|
| --- a/base/allocator/allocator_shim.cc
|
| +++ b/base/allocator/allocator_shim.cc
|
| @@ -8,6 +8,7 @@
|
| #include "base/allocator/allocator_extension_thunks.h"
|
| #include "base/profiler/alternate_timer.h"
|
| #include "base/sysinfo.h"
|
| +#include "jemalloc.h"
|
|
|
| // When defined, different heap allocators can be used via an environment
|
| // variable set before running the program. This may reduce the amount
|
| @@ -231,6 +232,44 @@ 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) {
|
| +#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.
|
| + return false;
|
| + }
|
| +#endif
|
| + return MallocExtension::instance()->GetNumericProperty(name, value);
|
| +}
|
| +
|
| static void get_stats_thunk(char* buffer, int buffer_length) {
|
| MallocExtension::instance()->GetStats(buffer, buffer_length);
|
| }
|
| @@ -284,6 +323,7 @@ extern "C" int _heap_init() {
|
| tracked_objects::TIME_SOURCE_TYPE_TCMALLOC);
|
| }
|
|
|
| + base::allocator::thunks::SetGetPropertyFunction(get_property_thunk);
|
| base::allocator::thunks::SetGetStatsFunction(get_stats_thunk);
|
| base::allocator::thunks::SetReleaseFreeMemoryFunction(
|
| release_free_memory_thunk);
|
|
|