Index: src/heap/heap.cc |
diff --git a/src/heap/heap.cc b/src/heap/heap.cc |
index 4451b5a6a5bc824c4fd2b5378ab99a3fce62c46c..71ef039624d144597ae9003967db73ad7f525c89 100644 |
--- a/src/heap/heap.cc |
+++ b/src/heap/heap.cc |
@@ -298,7 +298,6 @@ GarbageCollector Heap::SelectGarbageCollector(AllocationSpace space, |
void Heap::SetGCState(HeapState state) { |
gc_state_ = state; |
- store_buffer_->SetMode(gc_state_); |
} |
// TODO(1238405): Combine the infrastructure for --heap-stats and |
@@ -450,7 +449,6 @@ void Heap::GarbageCollectionPrologue() { |
} |
CheckNewSpaceExpansionCriteria(); |
UpdateNewSpaceAllocationCounter(); |
- store_buffer()->MoveAllEntriesToRememberedSet(); |
} |
size_t Heap::SizeOfObjects() { |
@@ -518,6 +516,22 @@ void Heap::MergeAllocationSitePretenuringFeedback( |
} |
} |
+class Heap::StoreBufferScope { |
+ public: |
+ explicit StoreBufferScope(StoreBuffer* store_buffer) |
+ : store_buffer_(store_buffer) { |
+ store_buffer_->MoveAllEntriesToRememberedSet(); |
+ store_buffer_->SetMode(StoreBuffer::IN_GC); |
+ } |
+ |
+ ~StoreBufferScope() { |
+ DCHECK(store_buffer_->Empty()); |
+ store_buffer_->SetMode(StoreBuffer::NOT_IN_GC); |
+ } |
+ |
+ private: |
+ StoreBuffer* store_buffer_; |
+}; |
class Heap::PretenuringScope { |
public: |
@@ -1327,6 +1341,7 @@ bool Heap::PerformGarbageCollection( |
{ |
Heap::PretenuringScope pretenuring_scope(this); |
+ Heap::StoreBufferScope store_buffer_scope(store_buffer_); |
switch (collector) { |
case MARK_COMPACTOR: |