Index: src/zone/accounting-allocator.h |
diff --git a/src/zone/accounting-allocator.h b/src/zone/accounting-allocator.h |
index f519c45db33637bbc78bbe3c0539269b17ab30db..70661cebe8e31075e76271d40a4a07a1ec70c69c 100644 |
--- a/src/zone/accounting-allocator.h |
+++ b/src/zone/accounting-allocator.h |
@@ -13,12 +13,18 @@ |
#include "src/base/platform/semaphore.h" |
#include "src/base/platform/time.h" |
#include "src/zone/zone-segment.h" |
+#include "testing/gtest/include/gtest/gtest_prod.h" |
namespace v8 { |
namespace internal { |
class V8_EXPORT_PRIVATE AccountingAllocator { |
public: |
+ static const size_t kMaxPoolSizeLowMemoryDevice = 8ul * KB; |
+ static const size_t kMaxPoolSizeMediumMemoryDevice = 1ul * MB; |
+ static const size_t kMaxPoolSizeHighMemoryDevice = 2ul * MB; |
+ static const size_t kMaxPoolSizeHugeMemoryDevice = 3ul * MB; |
+ |
AccountingAllocator(); |
virtual ~AccountingAllocator(); |
@@ -34,17 +40,26 @@ class V8_EXPORT_PRIVATE AccountingAllocator { |
size_t GetCurrentPoolSize() const; |
void MemoryPressureNotification(MemoryPressureLevel level); |
+ // Configures the zone segment pool size limits so the pool does not |
+ // grow bigger than max_pool_size. |
+ // TODO(heimbuef): Do not accept segments to pool that are larger than |
+ // their size class requires. Sometimes the zones generate weird segments. |
+ void ConfigureSegmentPool(const size_t max_pool_size); |
virtual void ZoneCreation(const Zone* zone) {} |
virtual void ZoneDestruction(const Zone* zone) {} |
private: |
- static const uint8_t kMinSegmentSizePower = 13; |
- static const uint8_t kMaxSegmentSizePower = 18; |
- static const uint8_t kMaxSegmentsPerBucket = 5; |
+ FRIEND_TEST(Zone, SegmentPoolConstraints); |
+ |
+ static const size_t kMinSegmentSizePower = 13; |
+ static const size_t kMaxSegmentSizePower = 18; |
STATIC_ASSERT(kMinSegmentSizePower <= kMaxSegmentSizePower); |
+ static const size_t kNumberBuckets = |
+ 1 + kMaxSegmentSizePower - kMinSegmentSizePower; |
+ |
// Allocates a new segment. Returns nullptr on failed allocation. |
Segment* AllocateSegment(size_t bytes); |
void FreeSegment(Segment* memory); |
@@ -57,10 +72,10 @@ class V8_EXPORT_PRIVATE AccountingAllocator { |
// Empties the pool and puts all its contents onto the garbage stack. |
void ClearPool(); |
- Segment* |
- unused_segments_heads_[1 + kMaxSegmentSizePower - kMinSegmentSizePower]; |
+ Segment* unused_segments_heads_[kNumberBuckets]; |
- size_t unused_segments_sizes[1 + kMaxSegmentSizePower - kMinSegmentSizePower]; |
+ size_t unused_segments_sizes_[kNumberBuckets]; |
+ size_t unused_segments_max_sizes_[kNumberBuckets]; |
base::Mutex unused_segments_mutex_; |