Index: src/heap/incremental-marking.cc |
diff --git a/src/heap/incremental-marking.cc b/src/heap/incremental-marking.cc |
index b9e7c61ba05942c8f9c2ce81a29569d3e2935527..3c3cf9a03d95057d7e552c9e939ccc18f738a17e 100644 |
--- a/src/heap/incremental-marking.cc |
+++ b/src/heap/incremental-marking.cc |
@@ -742,7 +742,6 @@ void IncrementalMarking::RetainMaps() { |
} |
} |
- |
void IncrementalMarking::FinalizeIncrementally() { |
TRACE_GC(heap()->tracer(), GCTracer::Scope::MC_INCREMENTAL_FINALIZE_BODY); |
DCHECK(!finalize_marking_completed_); |
@@ -775,6 +774,9 @@ void IncrementalMarking::FinalizeIncrementally() { |
abs(old_marking_deque_top - |
heap_->mark_compact_collector()->marking_deque()->top()); |
+ marking_progress += |
+ static_cast<int>(heap_->mark_compact_collector()->wrappers_to_trace()); |
+ |
double end = heap_->MonotonicallyIncreasingTimeInMs(); |
double delta = end - start; |
heap_->tracer()->AddMarkingTime(delta); |
@@ -1048,7 +1050,7 @@ double IncrementalMarking::AdvanceIncrementalMarking( |
step_actions.force_marking, step_actions.force_completion); |
remaining_time_in_ms = |
deadline_in_ms - heap()->MonotonicallyIncreasingTimeInMs(); |
- } while (bytes_processed > 0 && |
+ } while (!heap_->mark_compact_collector()->marking_deque()->IsEmpty() && |
remaining_time_in_ms >= |
2.0 * GCIdleTimeHandler::kIncrementalMarkingStepTimeInMs && |
!IsComplete() && |
@@ -1206,23 +1208,35 @@ intptr_t IncrementalMarking::Step(intptr_t allocated_bytes, |
} |
if (state_ == MARKING) { |
- bytes_processed = ProcessMarkingDeque(bytes_to_process); |
- if (FLAG_incremental_marking_wrappers && |
- heap_->UsingEmbedderHeapTracer()) { |
+ const bool incremental_wrapper_tracing = |
+ FLAG_incremental_marking_wrappers && heap_->UsingEmbedderHeapTracer(); |
+ const bool process_wrappers = |
+ incremental_wrapper_tracing && |
+ (heap_->mark_compact_collector() |
+ ->RequiresImmediateWrapperProcessing() || |
+ heap_->mark_compact_collector()->marking_deque()->IsEmpty()); |
+ bool wrapper_work_left = incremental_wrapper_tracing; |
+ if (!process_wrappers) { |
+ bytes_processed = ProcessMarkingDeque(bytes_to_process); |
+ } else { |
+ const double kWrapperTracngStepMs = 1.0; |
+ const double wrapper_deadline = |
+ heap_->MonotonicallyIncreasingTimeInMs() + kWrapperTracngStepMs; |
TRACE_GC(heap()->tracer(), |
GCTracer::Scope::MC_INCREMENTAL_WRAPPER_TRACING); |
- // This currently marks through all registered wrappers and does not |
- // respect bytes_to_process. |
- // TODO(hpayer): Integrate incremental marking of wrappers into |
- // bytes_to_process logic. |
heap_->mark_compact_collector() |
->RegisterWrappersWithEmbedderHeapTracer(); |
- heap_->mark_compact_collector()->embedder_heap_tracer()->AdvanceTracing( |
- 0, |
- EmbedderHeapTracer::AdvanceTracingActions( |
- EmbedderHeapTracer::ForceCompletionAction::FORCE_COMPLETION)); |
+ wrapper_work_left = |
+ heap_->mark_compact_collector() |
+ ->embedder_heap_tracer() |
+ ->AdvanceTracing(wrapper_deadline, |
+ EmbedderHeapTracer::AdvanceTracingActions( |
+ EmbedderHeapTracer::ForceCompletionAction:: |
+ DO_NOT_FORCE_COMPLETION)); |
} |
- if (heap_->mark_compact_collector()->marking_deque()->IsEmpty()) { |
+ |
+ if (heap_->mark_compact_collector()->marking_deque()->IsEmpty() && |
+ !wrapper_work_left) { |
if (completion == FORCE_COMPLETION || |
IsIdleMarkingDelayCounterLimitReached()) { |
if (!finalize_marking_completed_) { |