| Index: src/heap/incremental-marking.cc
|
| diff --git a/src/heap/incremental-marking.cc b/src/heap/incremental-marking.cc
|
| index 7f87512e9abf876438de4b9eab6ca05a75c833fc..d99b56be49a98ac5f69915141dacae8e9f08d3af 100644
|
| --- a/src/heap/incremental-marking.cc
|
| +++ b/src/heap/incremental-marking.cc
|
| @@ -19,12 +19,6 @@
|
| namespace v8 {
|
| namespace internal {
|
|
|
| -IncrementalMarking::StepActions IncrementalMarking::IdleStepActions() {
|
| - return StepActions(IncrementalMarking::NO_GC_VIA_STACK_GUARD,
|
| - IncrementalMarking::FORCE_MARKING,
|
| - IncrementalMarking::DO_NOT_FORCE_COMPLETION);
|
| -}
|
| -
|
| IncrementalMarking::IncrementalMarking(Heap* heap)
|
| : heap_(heap),
|
| observer_(*this, kAllocatedThreshold),
|
| @@ -1057,38 +1051,25 @@ void IncrementalMarking::Epilogue() {
|
| }
|
|
|
| double IncrementalMarking::AdvanceIncrementalMarking(
|
| - double deadline_in_ms, IncrementalMarking::StepActions step_actions) {
|
| + double deadline_in_ms, CompletionAction completion_action,
|
| + ForceCompletionAction force_completion) {
|
| DCHECK(!IsStopped());
|
|
|
| + double remaining_time_in_ms = 0.0;
|
| intptr_t step_size_in_bytes = GCIdleTimeHandler::EstimateMarkingStepSize(
|
| - GCIdleTimeHandler::kIncrementalMarkingStepTimeInMs,
|
| + kStepSizeInMs,
|
| heap()->tracer()->IncrementalMarkingSpeedInBytesPerMillisecond());
|
| - double remaining_time_in_ms = 0.0;
|
|
|
| do {
|
| - Step(step_size_in_bytes, step_actions.completion_action,
|
| - step_actions.force_marking, step_actions.force_completion);
|
| + Step(step_size_in_bytes, completion_action, force_completion);
|
| remaining_time_in_ms =
|
| deadline_in_ms - heap()->MonotonicallyIncreasingTimeInMs();
|
| - } while (!heap_->mark_compact_collector()->marking_deque()->IsEmpty() &&
|
| - remaining_time_in_ms >=
|
| - 2.0 * GCIdleTimeHandler::kIncrementalMarkingStepTimeInMs &&
|
| - !IsComplete() &&
|
| + } while (remaining_time_in_ms >= kStepSizeInMs && !IsComplete() &&
|
| !heap()->mark_compact_collector()->marking_deque()->IsEmpty());
|
| return remaining_time_in_ms;
|
| }
|
|
|
|
|
| -void IncrementalMarking::OldSpaceStep(intptr_t allocated) {
|
| - if (IsStopped() && ShouldActivateEvenWithoutIdleNotification()) {
|
| - heap()->StartIncrementalMarking(Heap::kNoGCFlags, kNoGCCallbackFlags,
|
| - "old space step");
|
| - } else {
|
| - Step(allocated * kFastMarking / kInitialMarkingSpeed, GC_VIA_STACK_GUARD);
|
| - }
|
| -}
|
| -
|
| -
|
| void IncrementalMarking::SpeedUp() {
|
| bool speed_up = false;
|
|
|
| @@ -1178,39 +1159,17 @@ void IncrementalMarking::FinalizeSweeping() {
|
| }
|
| }
|
|
|
| -intptr_t IncrementalMarking::Step(intptr_t allocated_bytes,
|
| - CompletionAction action,
|
| - ForceMarkingAction marking,
|
| - ForceCompletionAction completion) {
|
| - DCHECK(allocated_bytes >= 0);
|
| -
|
| +void IncrementalMarking::NotifyAllocatedBytes(intptr_t allocated_bytes) {
|
| if (heap_->gc_state() != Heap::NOT_IN_GC || !FLAG_incremental_marking ||
|
| (state_ != SWEEPING && state_ != MARKING)) {
|
| - return 0;
|
| + return;
|
| }
|
|
|
| allocated_ += allocated_bytes;
|
|
|
| - if (marking == DO_NOT_FORCE_MARKING && allocated_ < kAllocatedThreshold &&
|
| - write_barriers_invoked_since_last_step_ <
|
| + if (allocated_ >= kAllocatedThreshold ||
|
| + write_barriers_invoked_since_last_step_ >=
|
| kWriteBarriersInvokedThreshold) {
|
| - return 0;
|
| - }
|
| -
|
| - // If an idle notification happened recently, we delay marking steps.
|
| - if (marking == DO_NOT_FORCE_MARKING &&
|
| - heap_->RecentIdleNotificationHappened()) {
|
| - return 0;
|
| - }
|
| -
|
| - intptr_t bytes_processed = 0;
|
| - {
|
| - HistogramTimerScope incremental_marking_scope(
|
| - heap_->isolate()->counters()->gc_incremental_marking());
|
| - TRACE_EVENT0("v8", "V8.GCIncrementalMarking");
|
| - TRACE_GC(heap_->tracer(), GCTracer::Scope::MC_INCREMENTAL);
|
| - double start = heap_->MonotonicallyIncreasingTimeInMs();
|
| -
|
| // The marking speed is driven either by the allocation rate or by the rate
|
| // at which we are having to check the color of objects in the write
|
| // barrier.
|
| @@ -1222,73 +1181,83 @@ intptr_t IncrementalMarking::Step(intptr_t allocated_bytes,
|
| intptr_t bytes_to_process =
|
| marking_speed_ *
|
| Max(allocated_, write_barriers_invoked_since_last_step_);
|
| - allocated_ = 0;
|
| - write_barriers_invoked_since_last_step_ = 0;
|
| + Step(bytes_to_process, GC_VIA_STACK_GUARD, FORCE_COMPLETION);
|
| + }
|
| +}
|
|
|
| - bytes_scanned_ += bytes_to_process;
|
| +void IncrementalMarking::Step(intptr_t bytes_to_process,
|
| + CompletionAction action,
|
| + ForceCompletionAction completion) {
|
| + HistogramTimerScope incremental_marking_scope(
|
| + heap_->isolate()->counters()->gc_incremental_marking());
|
| + TRACE_EVENT0("v8", "V8.GCIncrementalMarking");
|
| + TRACE_GC(heap_->tracer(), GCTracer::Scope::MC_INCREMENTAL);
|
| + double start = heap_->MonotonicallyIncreasingTimeInMs();
|
|
|
| - if (state_ == SWEEPING) {
|
| - TRACE_GC(heap_->tracer(), GCTracer::Scope::MC_INCREMENTAL_SWEEPING);
|
| - FinalizeSweeping();
|
| - }
|
| + bytes_scanned_ += bytes_to_process;
|
|
|
| - if (state_ == MARKING) {
|
| - 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);
|
| - heap_->mark_compact_collector()
|
| - ->RegisterWrappersWithEmbedderHeapTracer();
|
| - wrapper_work_left =
|
| - heap_->mark_compact_collector()
|
| - ->embedder_heap_tracer()
|
| - ->AdvanceTracing(wrapper_deadline,
|
| - EmbedderHeapTracer::AdvanceTracingActions(
|
| - EmbedderHeapTracer::ForceCompletionAction::
|
| - DO_NOT_FORCE_COMPLETION));
|
| - }
|
| + allocated_ = 0;
|
| + write_barriers_invoked_since_last_step_ = 0;
|
| +
|
| + if (state_ == SWEEPING) {
|
| + TRACE_GC(heap_->tracer(), GCTracer::Scope::MC_INCREMENTAL_SWEEPING);
|
| + FinalizeSweeping();
|
| + }
|
|
|
| - if (heap_->mark_compact_collector()->marking_deque()->IsEmpty() &&
|
| - !wrapper_work_left) {
|
| - if (completion == FORCE_COMPLETION ||
|
| - IsIdleMarkingDelayCounterLimitReached()) {
|
| - if (!finalize_marking_completed_) {
|
| - FinalizeMarking(action);
|
| - } else {
|
| - MarkingComplete(action);
|
| - }
|
| + intptr_t bytes_processed = 0;
|
| + if (state_ == MARKING) {
|
| + 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 wrapper_deadline =
|
| + heap_->MonotonicallyIncreasingTimeInMs() + kStepSizeInMs;
|
| + TRACE_GC(heap()->tracer(),
|
| + GCTracer::Scope::MC_INCREMENTAL_WRAPPER_TRACING);
|
| + heap_->mark_compact_collector()->RegisterWrappersWithEmbedderHeapTracer();
|
| + 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() &&
|
| + !wrapper_work_left) {
|
| + if (completion == FORCE_COMPLETION ||
|
| + IsIdleMarkingDelayCounterLimitReached()) {
|
| + if (!finalize_marking_completed_) {
|
| + FinalizeMarking(action);
|
| } else {
|
| - IncrementIdleMarkingDelayCounter();
|
| + MarkingComplete(action);
|
| }
|
| + } else {
|
| + IncrementIdleMarkingDelayCounter();
|
| }
|
| }
|
| + }
|
|
|
| - steps_count_++;
|
| + steps_count_++;
|
|
|
| - // Speed up marking if we are marking too slow or if we are almost done
|
| - // with marking.
|
| - SpeedUp();
|
| + // Speed up marking if we are marking too slow or if we are almost done
|
| + // with marking.
|
| + SpeedUp();
|
|
|
| - double end = heap_->MonotonicallyIncreasingTimeInMs();
|
| - double duration = (end - start);
|
| - // Note that we report zero bytes here when sweeping was in progress or
|
| - // when we just started incremental marking. In these cases we did not
|
| - // process the marking deque.
|
| - heap_->tracer()->AddIncrementalMarkingStep(duration, bytes_processed);
|
| - }
|
| - return bytes_processed;
|
| + double end = heap_->MonotonicallyIncreasingTimeInMs();
|
| + double duration = (end - start);
|
| + // Note that we report zero bytes here when sweeping was in progress or
|
| + // when we just started incremental marking. In these cases we did not
|
| + // process the marking deque.
|
| + heap_->tracer()->AddIncrementalMarkingStep(duration, bytes_processed);
|
| }
|
|
|
|
|
|
|