Index: src/zone/zone.cc |
diff --git a/src/zone/zone.cc b/src/zone/zone.cc |
index 4272e17fd2eba2ef2389350b15ae05fd6abfed31..5b458c6746c124e8561a5406e6d472ddabc7e7ee 100644 |
--- a/src/zone/zone.cc |
+++ b/src/zone/zone.cc |
@@ -51,7 +51,6 @@ Zone::Zone(AccountingAllocator* allocator) |
Zone::~Zone() { |
DeleteAll(); |
- DeleteKeptSegment(); |
DCHECK(segment_bytes_allocated_ == 0); |
} |
@@ -92,73 +91,35 @@ void* Zone::New(size_t size) { |
} |
void Zone::DeleteAll() { |
- // Find a segment with a suitable size to keep around. |
- Segment* keep = nullptr; |
- // Traverse the chained list of segments, zapping (in debug mode) |
- // and freeing every segment except the one we wish to keep. |
+ // Traverse the chained list of segments and return them all to the allocator. |
for (Segment* current = segment_head_; current;) { |
Segment* next = current->next(); |
- if (!keep && current->size() <= kMaximumKeptSegmentSize) { |
- // Unlink the segment we wish to keep from the list. |
- keep = current; |
- keep->set_next(nullptr); |
- } else { |
- size_t size = current->size(); |
-#ifdef DEBUG |
- // Un-poison first so the zapping doesn't trigger ASan complaints. |
- ASAN_UNPOISON_MEMORY_REGION(current, size); |
-#endif |
- current->ZapContents(); |
- segment_bytes_allocated_ -= size; |
- allocator_->FreeSegment(current); |
- } |
+ size_t size = current->size(); |
+ |
+ // Un-poison the segment content so we can re-use or zap it later. |
+ ASAN_UNPOISON_MEMORY_REGION(current->start(), current->capacity()); |
+ |
+ segment_bytes_allocated_ -= size; |
+ allocator_->ReturnSegment(current); |
current = next; |
} |
- // If we have found a segment we want to keep, we must recompute the |
- // variables 'position' and 'limit' to prepare for future allocate |
- // attempts. Otherwise, we must clear the position and limit to |
- // force a new segment to be allocated on demand. |
- if (keep) { |
- Address start = keep->start(); |
- position_ = RoundUp(start, kAlignment); |
- limit_ = keep->end(); |
- // Un-poison so we can re-use the segment later. |
- ASAN_UNPOISON_MEMORY_REGION(start, keep->capacity()); |
- keep->ZapContents(); |
- } else { |
- position_ = limit_ = 0; |
- } |
+ position_ = limit_ = 0; |
allocation_size_ = 0; |
// Update the head segment to be the kept segment (if any). |
- segment_head_ = keep; |
-} |
- |
-void Zone::DeleteKeptSegment() { |
- DCHECK(segment_head_ == nullptr || segment_head_->next() == nullptr); |
- if (segment_head_ != nullptr) { |
- size_t size = segment_head_->size(); |
-#ifdef DEBUG |
- // Un-poison first so the zapping doesn't trigger ASan complaints. |
- ASAN_UNPOISON_MEMORY_REGION(segment_head_, size); |
-#endif |
- segment_head_->ZapContents(); |
- segment_bytes_allocated_ -= size; |
- allocator_->FreeSegment(segment_head_); |
- segment_head_ = nullptr; |
- } |
- |
- DCHECK(segment_bytes_allocated_ == 0); |
+ segment_head_ = nullptr; |
} |
// Creates a new segment, sets it size, and pushes it to the front |
// of the segment chain. Returns the new segment. |
-Segment* Zone::NewSegment(size_t size) { |
- Segment* result = allocator_->AllocateSegment(size); |
- segment_bytes_allocated_ += size; |
+Segment* Zone::NewSegment(size_t requested_size) { |
+ Segment* result = allocator_->GetSegment(requested_size); |
+ DCHECK_GE(result->size(), requested_size); |
+ segment_bytes_allocated_ += result->size(); |
if (result != nullptr) { |
- result->Initialize(segment_head_, size, this); |
+ result->set_zone(this); |
+ result->set_next(segment_head_); |
segment_head_ = result; |
} |
return result; |