v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
gc-invoker.cc
Go to the documentation of this file.
1// Copyright 2020 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 <memory>
8#include <optional>
9
13
14namespace cppgc {
15namespace internal {
16
18 public:
21
22 GCInvokerImpl(const GCInvokerImpl&) = delete;
24
25 void CollectGarbage(GCConfig) final;
27 size_t epoch() const final { return collector_->epoch(); }
28 std::optional<EmbedderStackState> overridden_stack_state() const final {
30 }
37#ifdef V8_ENABLE_ALLOCATION_TIMEOUT
38 std::optional<int> UpdateAllocationTimeout() final { return std::nullopt; }
39#endif // V8_ENABLE_ALLOCATION_TIMEOUT
40
41 private:
42 class GCTask final : public cppgc::Task {
43 public:
45
46 static Handle Post(GarbageCollector* collector, cppgc::TaskRunner* runner,
47 GCConfig config) {
48 auto task =
49 std::make_unique<GCInvoker::GCInvokerImpl::GCTask>(collector, config);
50 auto handle = task->GetHandle();
51 runner->PostNonNestableTask(std::move(task));
52 return handle;
53 }
54
55 explicit GCTask(GarbageCollector* collector, GCConfig config)
56 : collector_(collector),
57 config_(config),
58 handle_(Handle::NonEmptyTag{}),
59 saved_epoch_(collector->epoch()) {}
60
61 private:
70
71 Handle GetHandle() { return handle_; }
72
77 };
78
83};
84
86 cppgc::Platform* platform,
87 cppgc::Heap::StackSupport stack_support)
88 : collector_(collector),
89 platform_(platform),
90 stack_support_(stack_support) {}
91
93 if (gc_task_handle_) {
94 gc_task_handle_.Cancel();
95 }
96}
97
100 if ((config.stack_state == StackState::kNoHeapPointers) ||
101 (stack_support_ ==
103 collector_->CollectGarbage(config);
104 } else if (platform_->GetForegroundTaskRunner() &&
106 if (!gc_task_handle_) {
107 // Force a precise GC since it will run in a non-nestable task.
108 config.stack_state = StackState::kNoHeapPointers;
110 stack_support_);
111 gc_task_handle_ = GCTask::Post(
113 }
114 }
115}
116
118 GCConfig config) {
120 if ((stack_support_ !=
124 // In this configuration the GC finalization can only be triggered through
125 // ForceGarbageCollectionSlow. If incremental GC is started, there is no
126 // way to know how long it will remain enabled (and the write barrier with
127 // it). For that reason, we do not support running incremental GCs in this
128 // configuration.
129 return;
130 }
131 // No need to postpone starting incremental GC since the stack is not scanned
132 // until GC finalization.
133 collector_->StartIncrementalGarbageCollection(config);
134}
135
137 cppgc::Heap::StackSupport stack_support)
138 : impl_(std::make_unique<GCInvoker::GCInvokerImpl>(collector, platform,
139 stack_support)) {}
140
141GCInvoker::~GCInvoker() = default;
142
144 impl_->CollectGarbage(config);
145}
146
148 impl_->StartIncrementalGarbageCollection(config);
149}
150
151size_t GCInvoker::epoch() const { return impl_->epoch(); }
152
153std::optional<EmbedderStackState> GCInvoker::overridden_stack_state() const {
154 return impl_->overridden_stack_state();
155}
156
158 impl_->set_override_stack_state(state);
159}
160
162 impl_->clear_overridden_stack_state();
163}
164
165#ifdef V8_ENABLE_ALLOCATION_TIMEOUT
166std::optional<int> GCInvoker::UpdateAllocationTimeout() {
167 return impl_->UpdateAllocationTimeout();
168}
169#endif // V8_ENABLE_ALLOCATION_TIMEOUT
170
171} // namespace internal
172} // namespace cppgc
StackSupport
Definition heap.h:45
static Handle Post(GarbageCollector *collector, cppgc::TaskRunner *runner, GCConfig config)
Definition gc-invoker.cc:46
GCTask(GarbageCollector *collector, GCConfig config)
Definition gc-invoker.cc:55
GCInvokerImpl(GarbageCollector *, cppgc::Platform *, cppgc::Heap::StackSupport)
Definition gc-invoker.cc:85
cppgc::Heap::StackSupport stack_support_
Definition gc-invoker.cc:81
GCInvokerImpl(const GCInvokerImpl &)=delete
void StartIncrementalGarbageCollection(GCConfig) final
void set_override_stack_state(EmbedderStackState state) final
Definition gc-invoker.cc:31
std::optional< EmbedderStackState > overridden_stack_state() const final
Definition gc-invoker.cc:28
GCInvokerImpl & operator=(const GCInvokerImpl &)=delete
void CollectGarbage(GCConfig) final
size_t epoch() const final
void clear_overridden_stack_state() final
std::unique_ptr< GCInvokerImpl > impl_
Definition gc-invoker.h:51
std::optional< EmbedderStackState > overridden_stack_state() const final
GCInvoker(GarbageCollector *, cppgc::Platform *, cppgc::Heap::StackSupport)
void set_override_stack_state(EmbedderStackState state) final
void StartIncrementalGarbageCollection(GCConfig) final
virtual void clear_overridden_stack_state()=0
virtual std::optional< EmbedderStackState > overridden_stack_state() const =0
virtual size_t epoch() const =0
virtual void set_override_stack_state(EmbedderStackState state)=0
virtual void CollectGarbage(GCConfig)=0
std::shared_ptr< v8::TaskRunner > GetForegroundTaskRunner(Isolate *isolate)
virtual bool NonNestableTasksEnabled() const
v8::Platform * platform_
Definition cpp-heap.cc:193
MarkCompactCollector * collector_
EmbedderStackState
Definition common.h:15
STL namespace.
#define DCHECK_NE(v1, v2)
Definition logging.h:486
#define DCHECK_EQ(v1, v2)
Definition logging.h:485