Index: src/heap/incremental-marking.cc |
diff --git a/src/heap/incremental-marking.cc b/src/heap/incremental-marking.cc |
index d72423a60aa81619516404c2995ebc26df4e60a2..b38d85906ac426f9463a5593827851ba85ff39dc 100644 |
--- a/src/heap/incremental-marking.cc |
+++ b/src/heap/incremental-marking.cc |
@@ -27,6 +27,7 @@ IncrementalMarking::IncrementalMarking(Heap* heap) |
should_hurry_(false), |
marking_speed_(0), |
allocated_(0), |
+ idle_marking_delay_counter_(0), |
no_marking_scope_depth_(0), |
unscanned_bytes_of_large_object_(0) {} |
@@ -892,24 +893,27 @@ void IncrementalMarking::SpeedUp() { |
} |
-void IncrementalMarking::Step(intptr_t allocated_bytes, CompletionAction action, |
- bool force_marking) { |
+intptr_t IncrementalMarking::Step(intptr_t allocated_bytes, |
+ CompletionAction action, |
+ ForceMarkingAction marking, |
+ ForceCompletionAction completion) { |
if (heap_->gc_state() != Heap::NOT_IN_GC || !FLAG_incremental_marking || |
!FLAG_incremental_marking_steps || |
(state_ != SWEEPING && state_ != MARKING)) { |
- return; |
+ return 0; |
} |
allocated_ += allocated_bytes; |
- if (!force_marking && allocated_ < kAllocatedThreshold && |
+ if (marking == DO_NOT_FORCE_MARKING && allocated_ < kAllocatedThreshold && |
write_barriers_invoked_since_last_step_ < |
kWriteBarriersInvokedThreshold) { |
- return; |
+ return 0; |
} |
- if (state_ == MARKING && no_marking_scope_depth_ > 0) return; |
+ if (state_ == MARKING && no_marking_scope_depth_ > 0) return 0; |
+ intptr_t bytes_processed = 0; |
{ |
HistogramTimerScope incremental_marking_scope( |
heap_->isolate()->counters()->gc_incremental_marking()); |
@@ -930,7 +934,6 @@ void IncrementalMarking::Step(intptr_t allocated_bytes, CompletionAction action, |
write_barriers_invoked_since_last_step_ = 0; |
bytes_scanned_ += bytes_to_process; |
- intptr_t bytes_processed = 0; |
if (state_ == SWEEPING) { |
if (heap_->mark_compact_collector()->sweeping_in_progress() && |
@@ -943,7 +946,14 @@ void IncrementalMarking::Step(intptr_t allocated_bytes, CompletionAction action, |
} |
} else if (state_ == MARKING) { |
bytes_processed = ProcessMarkingDeque(bytes_to_process); |
- if (marking_deque_.IsEmpty()) MarkingComplete(action); |
+ if (marking_deque_.IsEmpty()) { |
+ if (completion == FORCE_COMPLETION || |
+ IsIdleMarkingDelayCounterLimitReached()) { |
+ MarkingComplete(action); |
+ } else { |
+ IncrementIdleMarkingDelayCounter(); |
+ } |
+ } |
} |
steps_count_++; |
@@ -959,6 +969,7 @@ void IncrementalMarking::Step(intptr_t allocated_bytes, CompletionAction action, |
// process the marking deque. |
heap_->tracer()->AddIncrementalMarkingStep(duration, bytes_processed); |
} |
+ return bytes_processed; |
} |
@@ -978,5 +989,20 @@ void IncrementalMarking::ResetStepCounters() { |
int64_t IncrementalMarking::SpaceLeftInOldSpace() { |
return heap_->MaxOldGenerationSize() - heap_->PromotedSpaceSizeOfObjects(); |
} |
+ |
+ |
+bool IncrementalMarking::IsIdleMarkingDelayCounterLimitReached() { |
+ return idle_marking_delay_counter_ > kMaxIdleMarkingDelayCounter; |
+} |
+ |
+ |
+void IncrementalMarking::IncrementIdleMarkingDelayCounter() { |
+ idle_marking_delay_counter_++; |
+} |
+ |
+ |
+void IncrementalMarking::ClearIdleMarkingDelayCounter() { |
+ idle_marking_delay_counter_ = 0; |
+} |
} |
} // namespace v8::internal |