Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(271)

Unified Diff: src/zone/accounting-allocator.h

Issue 2335343007: Pool implementation for zone segments (Closed)
Patch Set: Fixed windows build Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/v8.gyp ('k') | src/zone/accounting-allocator.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/zone/accounting-allocator.h
diff --git a/src/zone/accounting-allocator.h b/src/zone/accounting-allocator.h
index 31016a5018326d8c89e7cf1fd779ce111da5b2bb..6a32e18af7b8daaab93789e1e1b8dd8bf314525c 100644
--- a/src/zone/accounting-allocator.h
+++ b/src/zone/accounting-allocator.h
@@ -19,19 +19,55 @@ namespace internal {
class V8_EXPORT_PRIVATE AccountingAllocator {
public:
- AccountingAllocator() = default;
- virtual ~AccountingAllocator() = default;
+ AccountingAllocator();
+ virtual ~AccountingAllocator();
- virtual Segment* AllocateSegment(size_t bytes);
- virtual void FreeSegment(Segment* memory);
+ // Gets an empty segment from the pool or creates a new one.
+ virtual Segment* GetSegment(size_t bytes);
+ // Return unneeded segments to either insert them into the pool or release
+ // them if the pool is already full or memory pressure is high.
+ virtual void ReturnSegment(Segment* memory);
size_t GetCurrentMemoryUsage() const;
size_t GetMaxMemoryUsage() const;
+ size_t GetCurrentPoolSize() const;
+
+ void MemoryPressureNotification(MemoryPressureLevel level);
+
private:
+ static const uint8_t kMinSegmentSizePower = 13;
+ static const uint8_t kMaxSegmentSizePower = 18;
+ static const uint8_t kMaxSegmentsPerBucket = 5;
+
+ STATIC_ASSERT(kMinSegmentSizePower <= kMaxSegmentSizePower);
+
+ // Allocates a new segment. Returns nullptr on failed allocation.
+ Segment* AllocateSegment(size_t bytes);
+ void FreeSegment(Segment* memory);
+
+ // Returns a segment from the pool of at least the requested size.
+ Segment* GetSegmentFromPool(size_t requested_size);
+ // Trys to add a segment to the pool. Returns false if the pool is full.
+ bool AddSegmentToPool(Segment* segment);
+
+ // Empties the pool and puts all its contents onto the garbage stack.
+ void ClearPool();
+
+ Segment*
+ unused_segments_heads_[1 + kMaxSegmentSizePower - kMinSegmentSizePower];
+
+ size_t unused_segments_sizes[1 + kMaxSegmentSizePower - kMinSegmentSizePower];
+
+ size_t unused_segments_size_ = 0;
+
+ base::Mutex unused_segments_mutex_;
+
base::AtomicWord current_memory_usage_ = 0;
base::AtomicWord max_memory_usage_ = 0;
+ base::AtomicValue<MemoryPressureLevel> memory_pressure_level_;
+
DISALLOW_COPY_AND_ASSIGN(AccountingAllocator);
};
« no previous file with comments | « src/v8.gyp ('k') | src/zone/accounting-allocator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698