| Index: base/allocator/partition_allocator/partition_alloc.cc
|
| diff --git a/base/allocator/partition_allocator/partition_alloc.cc b/base/allocator/partition_allocator/partition_alloc.cc
|
| index 37d2633b95d59d298c1bf2f538dbe7a7c888c009..439ce177d88a5061ce42e50b50b94f8f0a923a1e 100644
|
| --- a/base/allocator/partition_allocator/partition_alloc.cc
|
| +++ b/base/allocator/partition_allocator/partition_alloc.cc
|
| @@ -1396,27 +1396,42 @@ void PartitionDumpStats(PartitionRoot* partition,
|
| const char* partition_name,
|
| bool is_light_dump,
|
| PartitionStatsDumper* dumper) {
|
| - static const size_t kMaxReportableBuckets = 4096 / sizeof(void*);
|
| - PartitionBucketMemoryStats memory_stats[kMaxReportableBuckets];
|
| - const size_t partitionNumBuckets = partition->num_buckets;
|
| - DCHECK(partitionNumBuckets <= kMaxReportableBuckets);
|
| -
|
| - for (size_t i = 0; i < partitionNumBuckets; ++i)
|
| - PartitionDumpBucketStats(&memory_stats[i], &partition->buckets()[i]);
|
|
|
| - // PartitionsDumpBucketStats is called after collecting stats because it
|
| - // can use PartitionAlloc to allocate and this can affect the statistics.
|
| PartitionMemoryStats stats = {0};
|
| stats.total_mmapped_bytes = partition->total_size_of_super_pages;
|
| stats.total_committed_bytes = partition->total_size_of_committed_pages;
|
| DCHECK(!partition->total_size_of_direct_mapped_pages);
|
| +
|
| + static const size_t kMaxReportableBuckets = 4096 / sizeof(void*);
|
| + std::unique_ptr<PartitionBucketMemoryStats[]> memory_stats;
|
| + if (!is_light_dump)
|
| + memory_stats = std::unique_ptr<PartitionBucketMemoryStats[]>(
|
| + new PartitionBucketMemoryStats[kMaxReportableBuckets]);
|
| +
|
| + const size_t partitionNumBuckets = partition->num_buckets;
|
| + DCHECK(partitionNumBuckets <= kMaxReportableBuckets);
|
| +
|
| for (size_t i = 0; i < partitionNumBuckets; ++i) {
|
| - if (memory_stats[i].is_valid) {
|
| - stats.total_resident_bytes += memory_stats[i].resident_bytes;
|
| - stats.total_active_bytes += memory_stats[i].active_bytes;
|
| - stats.total_decommittable_bytes += memory_stats[i].decommittable_bytes;
|
| - stats.total_discardable_bytes += memory_stats[i].discardable_bytes;
|
| - if (!is_light_dump)
|
| + PartitionBucketMemoryStats bucket_stats = {0};
|
| + PartitionDumpBucketStats(&bucket_stats, &partition->buckets()[i]);
|
| + if (bucket_stats.is_valid) {
|
| + stats.total_resident_bytes += bucket_stats.resident_bytes;
|
| + stats.total_active_bytes += bucket_stats.active_bytes;
|
| + stats.total_decommittable_bytes += bucket_stats.decommittable_bytes;
|
| + stats.total_discardable_bytes += bucket_stats.discardable_bytes;
|
| + }
|
| + if (!is_light_dump) {
|
| + if (bucket_stats.is_valid)
|
| + memory_stats[i] = bucket_stats;
|
| + else
|
| + memory_stats[i].is_valid = false;
|
| + }
|
| + }
|
| + if (!is_light_dump) {
|
| + // PartitionsDumpBucketStats is called after collecting stats because it
|
| + // can use PartitionAlloc to allocate and this can affect the statistics.
|
| + for (size_t i = 0; i < partitionNumBuckets; ++i) {
|
| + if (memory_stats[i].is_valid)
|
| dumper->PartitionsDumpBucketStats(partition_name, &memory_stats[i]);
|
| }
|
| }
|
|
|