v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
incremental-marking-job.cc
Go to the documentation of this file.
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
3// found in the LICENSE file.
4
6
7#include <optional>
8
13#include "src/flags/flags.h"
17#include "src/heap/gc-tracer.h"
18#include "src/heap/heap-inl.h"
19#include "src/heap/heap.h"
22#include "src/init/v8.h"
24
25namespace v8::internal {
26
28 public:
29 Task(Isolate* isolate, IncrementalMarkingJob* job, StackState stack_state)
30 : CancelableTask(isolate),
31 isolate_(isolate),
32 job_(job),
33 stack_state_(stack_state) {}
34
35 // CancelableTask overrides.
36 void RunInternal() override;
37
38 Isolate* isolate() const { return isolate_; }
39
40 private:
44};
45
47 : heap_(heap),
48 user_blocking_task_runner_(
49 heap->GetForegroundTaskRunner(TaskPriority::kUserBlocking)),
50 user_visible_task_runner_(
51 heap->GetForegroundTaskRunner(TaskPriority::kUserVisible)) {
52 CHECK(v8_flags.incremental_marking_task);
53}
54
57
59 return;
60 }
61
62 IncrementalMarking* incremental_marking = heap_->incremental_marking();
63 v8::TaskRunner* task_runner =
64 v8_flags.incremental_marking_start_user_visible &&
65 incremental_marking->IsStopped() &&
69 const bool non_nestable_tasks_enabled =
70 task_runner->NonNestableTasksEnabled();
71 auto task = std::make_unique<Task>(heap_->isolate(), this,
72 non_nestable_tasks_enabled
73 ? StackState::kNoHeapPointers
74 : StackState::kMayContainHeapPointers);
75 if (non_nestable_tasks_enabled) {
76 task_runner->PostNonNestableTask(std::move(task));
77 } else {
78 task_runner->PostTask(std::move(task));
79 }
80
81 pending_task_ = true;
83 if (V8_UNLIKELY(v8_flags.trace_incremental_marking)) {
84 heap_->isolate()->PrintWithTimestamp(
85 "[IncrementalMarking] Job: Schedule\n");
86 }
87}
88
92 "V8.IncrementalMarkingJob.Task");
93 // Set the current isolate such that trusted pointer tables etc are
94 // available and the cage base is set correctly for multi-cage mode.
95 SetCurrentIsolateScope isolate_scope(isolate());
96
97 isolate()->stack_guard()->ClearStartIncrementalMarking();
98
99 Heap* heap = isolate()->heap();
100
101 {
103 heap->tracer()->RecordTimeToIncrementalMarkingTask(
106 }
107
110
111 IncrementalMarking* incremental_marking = heap->incremental_marking();
112 if (incremental_marking->IsStopped()) {
113 if (heap->IncrementalMarkingLimitReached() !=
114 Heap::IncrementalMarkingLimit::kNoLimit) {
115 heap->StartIncrementalMarking(heap->GCFlagsForIncrementalMarking(),
118 } else if (v8_flags.minor_ms && v8_flags.concurrent_minor_ms_marking) {
119 heap->StartMinorMSIncrementalMarkingIfNeeded();
120 }
121 }
122
123 // Clear this flag after StartIncrementalMarking() call to avoid scheduling a
124 // new task when starting incremental marking from a task.
125 {
127 if (V8_UNLIKELY(v8_flags.trace_incremental_marking)) {
128 job_->heap_->isolate()->PrintWithTimestamp(
129 "[IncrementalMarking] Job: Run\n");
130 }
131 job_->pending_task_ = false;
132 }
133
134 if (incremental_marking->IsMajorMarking()) {
135 heap->incremental_marking()->AdvanceAndFinalizeIfComplete();
136 if (incremental_marking->IsMajorMarking()) {
137 if (V8_UNLIKELY(v8_flags.trace_incremental_marking)) {
138 isolate()->PrintWithTimestamp(
139 "[IncrementalMarking] Using regular task based on flags\n");
140 }
142 }
143 }
144}
145
146std::optional<base::TimeDelta> IncrementalMarkingJob::CurrentTimeToTask()
147 const {
148 std::optional<base::TimeDelta> current_time_to_task;
149 if (pending_task_) {
150 const auto now = base::TimeTicks::Now();
152 current_time_to_task.emplace(now - scheduled_time_);
153 }
154 return current_time_to_task;
155}
156
157std::optional<v8::base::TimeDelta> IncrementalMarkingJob::AverageTimeToTask()
158 const {
160}
161
162} // namespace v8::internal
void PostTask(std::unique_ptr< Task > task, const SourceLocation &location=SourceLocation::Current())
Definition v8-platform.h:82
virtual bool NonNestableTasksEnabled() const
void PostNonNestableTask(std::unique_ptr< Task > task, const SourceLocation &location=SourceLocation::Current())
static TimeTicks Now()
Definition time.cc:736
std::optional< base::TimeDelta > AverageTimeToIncrementalMarkingTask() const
bool IsTearingDown() const
Definition heap.h:525
IncrementalMarking * incremental_marking() const
Definition heap.h:1062
GCTracer * tracer()
Definition heap.h:800
Isolate * isolate() const
Definition heap-inl.h:61
Task(Isolate *isolate, IncrementalMarkingJob *job, StackState stack_state)
std::optional< v8::base::TimeDelta > AverageTimeToTask() const
const std::shared_ptr< v8::TaskRunner > user_blocking_task_runner_
std::optional< v8::base::TimeDelta > CurrentTimeToTask() const
void ScheduleTask(TaskPriority priority=TaskPriority::kUserBlocking)
const std::shared_ptr< v8::TaskRunner > user_visible_task_runner_
StackGuard * stack_guard()
Definition isolate.h:1198
LiftoffAssembler::CacheState state
size_t priority
EmbedderStackState
Definition common.h:15
V8_EXPORT_PRIVATE FlagValues v8_flags
@ kGCCallbackScheduleIdleGarbageCollection
TaskPriority
Definition v8-platform.h:24
#define CHECK(condition)
Definition logging.h:124
#define DCHECK_GE(v1, v2)
Definition logging.h:488
Heap * heap_
#define TRACE_EVENT_CALL_STATS_SCOPED(isolate, category_group, name)
#define V8_UNLIKELY(condition)
Definition v8config.h:660