diff options
Diffstat (limited to 'deps/v8/src/heap/incremental-marking-job.cc')
-rw-r--r-- | deps/v8/src/heap/incremental-marking-job.cc | 130 |
1 files changed, 24 insertions, 106 deletions
diff --git a/deps/v8/src/heap/incremental-marking-job.cc b/deps/v8/src/heap/incremental-marking-job.cc index fe14dd04c6..393b9cce7e 100644 --- a/deps/v8/src/heap/incremental-marking-job.cc +++ b/deps/v8/src/heap/incremental-marking-job.cc @@ -14,131 +14,49 @@ namespace v8 { namespace internal { -const double IncrementalMarkingJob::kLongDelayInSeconds = 5; -const double IncrementalMarkingJob::kShortDelayInSeconds = 0.5; - void IncrementalMarkingJob::Start(Heap* heap) { DCHECK(!heap->incremental_marking()->IsStopped()); - // We don't need to reset the flags because tasks from the previous job - // can still be pending. We just want to ensure that tasks are posted - // if they are not pending. - // If delayed task is pending and made_progress_since_last_delayed_task_ is - // true, then the delayed task will clear that flag when it is rescheduled. - ScheduleIdleTask(heap); - ScheduleDelayedTask(heap); -} - - -void IncrementalMarkingJob::NotifyIdleTask() { idle_task_pending_ = false; } - - -void IncrementalMarkingJob::NotifyDelayedTask() { - delayed_task_pending_ = false; -} - - -void IncrementalMarkingJob::NotifyIdleTaskProgress() { - made_progress_since_last_delayed_task_ = true; + ScheduleTask(heap); } +void IncrementalMarkingJob::NotifyTask() { task_pending_ = false; } -void IncrementalMarkingJob::ScheduleIdleTask(Heap* heap) { - if (!idle_task_pending_) { +void IncrementalMarkingJob::ScheduleTask(Heap* heap) { + if (!task_pending_) { v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(heap->isolate()); - if (V8::GetCurrentPlatform()->IdleTasksEnabled(isolate)) { - idle_task_pending_ = true; - auto task = new IdleTask(heap->isolate(), this); - V8::GetCurrentPlatform()->CallIdleOnForegroundThread(isolate, task); - } + task_pending_ = true; + auto task = new Task(heap->isolate(), this); + V8::GetCurrentPlatform()->CallOnForegroundThread(isolate, task); } } - -void IncrementalMarkingJob::ScheduleDelayedTask(Heap* heap) { - if (!delayed_task_pending_ && FLAG_memory_reducer) { - v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(heap->isolate()); - delayed_task_pending_ = true; - made_progress_since_last_delayed_task_ = false; - auto task = new DelayedTask(heap->isolate(), this); - double delay = - heap->HighMemoryPressure() ? kShortDelayInSeconds : kLongDelayInSeconds; - V8::GetCurrentPlatform()->CallDelayedOnForegroundThread(isolate, task, - delay); - } -} - - -IncrementalMarkingJob::IdleTask::Progress IncrementalMarkingJob::IdleTask::Step( - Heap* heap, double deadline_in_ms) { - IncrementalMarking* incremental_marking = heap->incremental_marking(); - if (incremental_marking->IsStopped()) { - return kDone; - } - if (incremental_marking->IsSweeping()) { - incremental_marking->FinalizeSweeping(); - // TODO(hpayer): We can continue here if enough idle time is left. - return kMoreWork; - } - const double remaining_idle_time_in_ms = - incremental_marking->AdvanceIncrementalMarking( - deadline_in_ms, IncrementalMarking::IdleStepActions()); - if (remaining_idle_time_in_ms > 0.0) { - heap->TryFinalizeIdleIncrementalMarking(remaining_idle_time_in_ms); - } - return incremental_marking->IsStopped() ? kDone : kMoreWork; -} - - -void IncrementalMarkingJob::IdleTask::RunInternal(double deadline_in_seconds) { - double deadline_in_ms = - deadline_in_seconds * - static_cast<double>(base::Time::kMillisecondsPerSecond); - Heap* heap = isolate()->heap(); - double start_ms = heap->MonotonicallyIncreasingTimeInMs(); - job_->NotifyIdleTask(); - job_->NotifyIdleTaskProgress(); - if (Step(heap, deadline_in_ms) == kMoreWork) { - job_->ScheduleIdleTask(heap); - } - if (FLAG_trace_idle_notification) { - double current_time_ms = heap->MonotonicallyIncreasingTimeInMs(); - double idle_time_in_ms = deadline_in_ms - start_ms; - double deadline_difference = deadline_in_ms - current_time_ms; - PrintIsolate(isolate(), "%8.0f ms: ", isolate()->time_millis_since_init()); - PrintF( - "Idle task: requested idle time %.2f ms, used idle time %.2f " - "ms, deadline usage %.2f ms\n", - idle_time_in_ms, idle_time_in_ms - deadline_difference, - deadline_difference); - } -} - - -void IncrementalMarkingJob::DelayedTask::Step(Heap* heap) { - const int kIncrementalMarkingDelayMs = 50; +void IncrementalMarkingJob::Task::Step(Heap* heap) { + const int kIncrementalMarkingDelayMs = 1; double deadline = heap->MonotonicallyIncreasingTimeInMs() + kIncrementalMarkingDelayMs; heap->incremental_marking()->AdvanceIncrementalMarking( - deadline, i::IncrementalMarking::StepActions( - i::IncrementalMarking::NO_GC_VIA_STACK_GUARD, - i::IncrementalMarking::FORCE_MARKING, - i::IncrementalMarking::FORCE_COMPLETION)); + deadline, i::IncrementalMarking::NO_GC_VIA_STACK_GUARD, + i::IncrementalMarking::FORCE_COMPLETION, i::StepOrigin::kTask); heap->FinalizeIncrementalMarkingIfComplete( - "Incremental marking task: finalize incremental marking"); + GarbageCollectionReason::kFinalizeMarkingViaTask); } - -void IncrementalMarkingJob::DelayedTask::RunInternal() { +void IncrementalMarkingJob::Task::RunInternal() { Heap* heap = isolate()->heap(); - job_->NotifyDelayedTask(); + job_->NotifyTask(); IncrementalMarking* incremental_marking = heap->incremental_marking(); - if (!incremental_marking->IsStopped()) { - if (job_->ShouldForceMarkingStep()) { - Step(heap); + if (incremental_marking->IsStopped()) { + if (heap->IncrementalMarkingLimitReached() != + Heap::IncrementalMarkingLimit::kNoLimit) { + heap->StartIncrementalMarking(Heap::kNoGCFlags, + GarbageCollectionReason::kIdleTask, + kNoGCCallbackFlags); } - // The Step() above could have finished incremental marking. + } + if (!incremental_marking->IsStopped()) { + Step(heap); if (!incremental_marking->IsStopped()) { - job_->ScheduleDelayedTask(heap); + job_->ScheduleTask(heap); } } } |