Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(549)

Unified Diff: src/heap/incremental-marking-job.cc

Issue 2321553002: [heap] Do more incremental marking work in tasks. (Closed)
Patch Set: address comment Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/heap/incremental-marking-job.h ('k') | src/heap/memory-reducer.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/heap/incremental-marking-job.cc
diff --git a/src/heap/incremental-marking-job.cc b/src/heap/incremental-marking-job.cc
index 799a1e2a1aaf90bb66b53144effea9d16e5afeaa..c20cffcdef75b259dc1d22b6991b8b16c57823c1 100644
--- a/src/heap/incremental-marking-job.cc
+++ b/src/heap/incremental-marking-job.cc
@@ -14,132 +14,41 @@
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;
-}
-
-
-void IncrementalMarkingJob::ScheduleIdleTask(Heap* heap) {
- if (!idle_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);
- }
- }
+ ScheduleTask(heap);
}
+void IncrementalMarkingJob::NotifyTask() { task_pending_ = false; }
-void IncrementalMarkingJob::ScheduleDelayedTask(Heap* heap) {
- if (!delayed_task_pending_ && FLAG_memory_reducer) {
+void IncrementalMarkingJob::ScheduleTask(Heap* heap) {
+ if (!task_pending_) {
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);
+ task_pending_ = true;
+ auto task = new Task(heap->isolate(), this);
+ V8::GetCurrentPlatform()->CallOnForegroundThread(isolate, task);
}
}
-
-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::NO_GC_VIA_STACK_GUARD,
- IncrementalMarking::DO_NOT_FORCE_COMPLETION);
- if (remaining_idle_time_in_ms > 0.0) {
- heap->TryFinalizeIdleIncrementalMarking(
- remaining_idle_time_in_ms,
- GarbageCollectionReason::kFinalizeMarkingViaTask);
- }
- 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, IncrementalMarking::NO_GC_VIA_STACK_GUARD,
- IncrementalMarking::FORCE_COMPLETION);
+ deadline, i::IncrementalMarking::NO_GC_VIA_STACK_GUARD,
+ i::IncrementalMarking::FORCE_COMPLETION, i::StepOrigin::kTask);
heap->FinalizeIncrementalMarkingIfComplete(
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);
- }
- // The Step() above could have finished incremental marking.
+ Step(heap);
if (!incremental_marking->IsStopped()) {
- job_->ScheduleDelayedTask(heap);
+ job_->ScheduleTask(heap);
}
}
}
« no previous file with comments | « src/heap/incremental-marking-job.h ('k') | src/heap/memory-reducer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698