Chromium Code Reviews| Index: src/zone/accounting-allocator.cc |
| diff --git a/src/zone/accounting-allocator.cc b/src/zone/accounting-allocator.cc |
| index 33873dfc6c6b08b903f7f72701cd4400831917ae..d6425d9011771ef1d44cd61188ee1b9d1cebf224 100644 |
| --- a/src/zone/accounting-allocator.cc |
| +++ b/src/zone/accounting-allocator.cc |
| @@ -14,15 +14,14 @@ namespace v8 { |
| namespace internal { |
| AccountingAllocator::AccountingAllocator() : unused_segments_mutex_() { |
| + static const uint8_t kDefaultBucketMaxSize = 5; |
|
jochen (gone - plz use gerrit)
2016/10/19 14:18:31
also in this file, please don't unnecessarily cons
|
| + |
| memory_pressure_level_.SetValue(MemoryPressureLevel::kNone); |
| - std::fill(unused_segments_heads_, |
| - unused_segments_heads_ + |
| - (1 + kMaxSegmentSizePower - kMinSegmentSizePower), |
| + std::fill(unused_segments_heads_, unused_segments_heads_ + kNumberBuckets, |
| nullptr); |
| - std::fill( |
| - unused_segments_sizes, |
| - unused_segments_sizes + (1 + kMaxSegmentSizePower - kMinSegmentSizePower), |
| - 0); |
| + std::fill(unused_segments_sizes, unused_segments_sizes + kNumberBuckets, 0); |
| + std::fill(unused_segments_max_sizes, |
| + unused_segments_max_sizes + kNumberBuckets, kDefaultBucketMaxSize); |
| } |
| AccountingAllocator::~AccountingAllocator() { ClearPool(); } |
| @@ -36,6 +35,34 @@ void AccountingAllocator::MemoryPressureNotification( |
| } |
| } |
| +void AccountingAllocator::ConfigureSegmentPool(const size_t max_pool_size) { |
| + // The sum of the bytes of one segment of each size. |
| + static const size_t full_size = (size_t(1) << (kMaxSegmentSizePower + 1)) - |
| + (size_t(1) << kMinSegmentSizePower); |
| + uint8_t fits_fully = max_pool_size / full_size; |
| + |
| + base::LockGuard<base::Mutex> lock_guard(&unused_segments_mutex_); |
| + |
| + size_t total_size = fits_fully * full_size; |
| + |
| + for (uint8_t power = 0; power < kNumberBuckets; power++) { |
|
jochen (gone - plz use gerrit)
2016/10/19 14:18:31
++power (same below)
|
| + if (total_size + (size_t(1) << power) <= max_pool_size) { |
| + unused_segments_max_sizes[power] = fits_fully + 1; |
| + total_size += size_t(1) << power; |
| + } else { |
| + unused_segments_max_sizes[power] = fits_fully; |
| + } |
| + } |
| + |
| +#if DEBUG |
| + total_size = 0; |
| + for (uint8_t power = 0; power < kNumberBuckets; power++) { |
| + total_size += unused_segments_max_sizes[power] * (size_t(1) << power); |
| + } |
| + CHECK_LE(total_size, max_pool_size); |
|
jochen (gone - plz use gerrit)
2016/10/19 14:18:31
this really should be a unit test
|
| +#endif |
| +} |
| + |
| Segment* AccountingAllocator::GetSegment(size_t bytes) { |
| Segment* result = GetSegmentFromPool(bytes); |
| if (result == nullptr) { |
| @@ -138,7 +165,7 @@ bool AccountingAllocator::AddSegmentToPool(Segment* segment) { |
| { |
| base::LockGuard<base::Mutex> lock_guard(&unused_segments_mutex_); |
| - if (unused_segments_sizes[power] >= kMaxSegmentsPerBucket) { |
| + if (unused_segments_sizes[power] >= unused_segments_max_sizes[power]) { |
| return false; |
| } |