Index: src/heap/incremental-marking.cc |
diff --git a/src/heap/incremental-marking.cc b/src/heap/incremental-marking.cc |
index 686c6738821437a1621c4f495391632813ae58e3..33b708dc5bd24a1454498525507c4a741dd1c327 100644 |
--- a/src/heap/incremental-marking.cc |
+++ b/src/heap/incremental-marking.cc |
@@ -1011,17 +1011,20 @@ double IncrementalMarking::AdvanceIncrementalMarking( |
heap() |
->tracer() |
->FinalIncrementalMarkCompactSpeedInBytesPerMillisecond()); |
- double remaining_time_in_ms = |
- deadline_in_ms - heap()->MonotonicallyIncreasingTimeInMs(); |
- while (remaining_time_in_ms >= |
- GCIdleTimeHandler::kMinIncrementalMarkingStepTimeInMs) { |
- intptr_t bytes_processed = |
+ double remaining_time_in_ms = 0.0; |
+ intptr_t bytes_processed = 0; |
+ |
+ do { |
+ bytes_processed = |
Step(step_size_in_bytes, step_actions.completion_action, |
step_actions.force_marking, step_actions.force_completion); |
remaining_time_in_ms = |
deadline_in_ms - heap()->MonotonicallyIncreasingTimeInMs(); |
- if (bytes_processed == 0) break; |
- } |
+ } while (bytes_processed > 0 && |
+ remaining_time_in_ms >= |
+ 2.0 * GCIdleTimeHandler::kIncrementalMarkingStepTimeInMs && |
+ !IsComplete() && |
+ !heap()->mark_compact_collector()->marking_deque()->IsEmpty()); |
return remaining_time_in_ms; |
} |