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

Side by Side Diff: src/heap/incremental-marking-job.cc

Issue 2321553002: [heap] Do more incremental marking work in tasks. (Closed)
Patch Set: 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 unified diff | Download patch
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/heap/incremental-marking-job.h" 5 #include "src/heap/incremental-marking-job.h"
6 6
7 #include "src/base/platform/time.h" 7 #include "src/base/platform/time.h"
8 #include "src/heap/heap-inl.h" 8 #include "src/heap/heap-inl.h"
9 #include "src/heap/heap.h" 9 #include "src/heap/heap.h"
10 #include "src/heap/incremental-marking.h" 10 #include "src/heap/incremental-marking.h"
11 #include "src/isolate.h" 11 #include "src/isolate.h"
12 #include "src/v8.h" 12 #include "src/v8.h"
13 13
14 namespace v8 { 14 namespace v8 {
15 namespace internal { 15 namespace internal {
16 16
17 const double IncrementalMarkingJob::kLongDelayInSeconds = 5;
18 const double IncrementalMarkingJob::kShortDelayInSeconds = 0.5;
19
20 void IncrementalMarkingJob::Start(Heap* heap) { 17 void IncrementalMarkingJob::Start(Heap* heap) {
21 DCHECK(!heap->incremental_marking()->IsStopped()); 18 DCHECK(!heap->incremental_marking()->IsStopped());
22 // We don't need to reset the flags because tasks from the previous job 19 ScheduleTask(heap);
23 // can still be pending. We just want to ensure that tasks are posted
24 // if they are not pending.
25 // If delayed task is pending and made_progress_since_last_delayed_task_ is
26 // true, then the delayed task will clear that flag when it is rescheduled.
27 ScheduleIdleTask(heap);
28 ScheduleDelayedTask(heap);
29 } 20 }
30 21
22 void IncrementalMarkingJob::NotifyTask() { task_pending_ = false; }
31 23
32 void IncrementalMarkingJob::NotifyIdleTask() { idle_task_pending_ = false; } 24 void IncrementalMarkingJob::ScheduleTask(Heap* heap) {
33 25 if (!task_pending_) {
34
35 void IncrementalMarkingJob::NotifyDelayedTask() {
36 delayed_task_pending_ = false;
37 }
38
39
40 void IncrementalMarkingJob::NotifyIdleTaskProgress() {
41 made_progress_since_last_delayed_task_ = true;
42 }
43
44
45 void IncrementalMarkingJob::ScheduleIdleTask(Heap* heap) {
46 if (!idle_task_pending_) {
47 v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(heap->isolate()); 26 v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(heap->isolate());
48 if (V8::GetCurrentPlatform()->IdleTasksEnabled(isolate)) { 27 task_pending_ = true;
49 idle_task_pending_ = true; 28 auto task = new Task(heap->isolate(), this);
50 auto task = new IdleTask(heap->isolate(), this); 29 V8::GetCurrentPlatform()->CallOnForegroundThread(isolate, task);
51 V8::GetCurrentPlatform()->CallIdleOnForegroundThread(isolate, task);
52 }
53 } 30 }
54 } 31 }
55 32
56 33 void IncrementalMarkingJob::Task::Step(Heap* heap) {
57 void IncrementalMarkingJob::ScheduleDelayedTask(Heap* heap) { 34 const int kIncrementalMarkingDelayMs = 1;
58 if (!delayed_task_pending_ && FLAG_memory_reducer) {
59 v8::Isolate* isolate = reinterpret_cast<v8::Isolate*>(heap->isolate());
60 delayed_task_pending_ = true;
61 made_progress_since_last_delayed_task_ = false;
62 auto task = new DelayedTask(heap->isolate(), this);
63 double delay =
64 heap->HighMemoryPressure() ? kShortDelayInSeconds : kLongDelayInSeconds;
65 V8::GetCurrentPlatform()->CallDelayedOnForegroundThread(isolate, task,
66 delay);
67 }
68 }
69
70
71 IncrementalMarkingJob::IdleTask::Progress IncrementalMarkingJob::IdleTask::Step(
72 Heap* heap, double deadline_in_ms) {
73 IncrementalMarking* incremental_marking = heap->incremental_marking();
74 if (incremental_marking->IsStopped()) {
75 return kDone;
76 }
77 if (incremental_marking->IsSweeping()) {
78 incremental_marking->FinalizeSweeping();
79 // TODO(hpayer): We can continue here if enough idle time is left.
80 return kMoreWork;
81 }
82 const double remaining_idle_time_in_ms =
83 incremental_marking->AdvanceIncrementalMarking(
84 deadline_in_ms, IncrementalMarking::NO_GC_VIA_STACK_GUARD,
85 IncrementalMarking::DO_NOT_FORCE_COMPLETION);
86 if (remaining_idle_time_in_ms > 0.0) {
87 heap->TryFinalizeIdleIncrementalMarking(
88 remaining_idle_time_in_ms,
89 GarbageCollectionReason::kFinalizeMarkingViaTask);
90 }
91 return incremental_marking->IsStopped() ? kDone : kMoreWork;
92 }
93
94
95 void IncrementalMarkingJob::IdleTask::RunInternal(double deadline_in_seconds) {
96 double deadline_in_ms =
97 deadline_in_seconds *
98 static_cast<double>(base::Time::kMillisecondsPerSecond);
99 Heap* heap = isolate()->heap();
100 double start_ms = heap->MonotonicallyIncreasingTimeInMs();
101 job_->NotifyIdleTask();
102 job_->NotifyIdleTaskProgress();
103 if (Step(heap, deadline_in_ms) == kMoreWork) {
104 job_->ScheduleIdleTask(heap);
105 }
106 if (FLAG_trace_idle_notification) {
107 double current_time_ms = heap->MonotonicallyIncreasingTimeInMs();
108 double idle_time_in_ms = deadline_in_ms - start_ms;
109 double deadline_difference = deadline_in_ms - current_time_ms;
110 PrintIsolate(isolate(), "%8.0f ms: ", isolate()->time_millis_since_init());
111 PrintF(
112 "Idle task: requested idle time %.2f ms, used idle time %.2f "
113 "ms, deadline usage %.2f ms\n",
114 idle_time_in_ms, idle_time_in_ms - deadline_difference,
115 deadline_difference);
116 }
117 }
118
119
120 void IncrementalMarkingJob::DelayedTask::Step(Heap* heap) {
121 const int kIncrementalMarkingDelayMs = 50;
122 double deadline = 35 double deadline =
123 heap->MonotonicallyIncreasingTimeInMs() + kIncrementalMarkingDelayMs; 36 heap->MonotonicallyIncreasingTimeInMs() + kIncrementalMarkingDelayMs;
124 heap->incremental_marking()->AdvanceIncrementalMarking( 37 heap->incremental_marking()->AdvanceIncrementalMarking(
125 deadline, IncrementalMarking::NO_GC_VIA_STACK_GUARD, 38 deadline, i::IncrementalMarking::NO_GC_VIA_STACK_GUARD,
126 IncrementalMarking::FORCE_COMPLETION); 39 i::IncrementalMarking::FORCE_COMPLETION, i::StepOrigin::kTask);
127 heap->FinalizeIncrementalMarkingIfComplete( 40 heap->FinalizeIncrementalMarkingIfComplete(
128 GarbageCollectionReason::kFinalizeMarkingViaTask); 41 GarbageCollectionReason::kFinalizeMarkingViaTask);
129 } 42 }
130 43
131 44 void IncrementalMarkingJob::Task::RunInternal() {
132 void IncrementalMarkingJob::DelayedTask::RunInternal() {
133 Heap* heap = isolate()->heap(); 45 Heap* heap = isolate()->heap();
134 job_->NotifyDelayedTask(); 46 job_->NotifyTask();
135 IncrementalMarking* incremental_marking = heap->incremental_marking(); 47 IncrementalMarking* incremental_marking = heap->incremental_marking();
136 if (!incremental_marking->IsStopped()) { 48 if (!incremental_marking->IsStopped()) {
137 if (job_->ShouldForceMarkingStep()) { 49 Step(heap);
138 Step(heap);
139 }
140 // The Step() above could have finished incremental marking.
141 if (!incremental_marking->IsStopped()) { 50 if (!incremental_marking->IsStopped()) {
142 job_->ScheduleDelayedTask(heap); 51 job_->ScheduleTask(heap);
143 } 52 }
144 } 53 }
145 } 54 }
146 55
147 } // namespace internal 56 } // namespace internal
148 } // namespace v8 57 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698