| Index: src/zone/accounting-allocator.cc
|
| diff --git a/src/zone/accounting-allocator.cc b/src/zone/accounting-allocator.cc
|
| index 33873dfc6c6b08b903f7f72701cd4400831917ae..4a87fde0a3fa769c4543747211ca30923e42373d 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;
|
| +
|
| 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,33 @@ void AccountingAllocator::MemoryPressureNotification(
|
| }
|
| }
|
|
|
| +void AccountingAllocator::ConfigureSegmentPool(const size_t max_pool_size) {
|
| + static const size_t full_size =
|
| + (1 << (kMaxSegmentSizePower + 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++) {
|
| + 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);
|
| +#endif
|
| +}
|
| +
|
| Segment* AccountingAllocator::GetSegment(size_t bytes) {
|
| Segment* result = GetSegmentFromPool(bytes);
|
| if (result == nullptr) {
|
| @@ -138,7 +164,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;
|
| }
|
|
|
|
|