v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
unified-heap-marking-visitor.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
10#include "src/heap/heap.h"
13
14namespace v8 {
15namespace internal {
16
17namespace {
18std::unique_ptr<MarkingWorklists::Local> GetV8MarkingWorklists(
19 Heap* heap, cppgc::internal::CollectionType collection_type) {
20 if (!heap) return {};
21 auto* worklist =
23 ? heap->mark_compact_collector()->marking_worklists()
24 : heap->minor_mark_sweep_collector()->marking_worklists();
25 return std::make_unique<MarkingWorklists::Local>(worklist);
26}
27} // namespace
28
31 UnifiedHeapMarkingState& unified_heap_marking_state)
32 : JSVisitor(cppgc::internal::VisitorFactory::CreateKey()),
33 marking_state_(marking_state),
34 unified_heap_marking_state_(unified_heap_marking_state) {}
35
37 TraceDescriptor desc) {
38 marking_state_.MarkAndPush(object, desc);
39}
40
42 const void* start, size_t len,
43 TraceDescriptorCallback get_trace_descriptor) {
44 const char* it = static_cast<const char*>(start);
45 const char* end = it + len * cppgc::internal::kSizeOfUncompressedMember;
47 const auto* current =
48 reinterpret_cast<const cppgc::internal::RawPointer*>(it);
49 const void* object = current->LoadAtomic();
50 if (!object) continue;
51
52 marking_state_.MarkAndPush(object, get_trace_descriptor(object));
53 }
54}
55
56#if defined(CPPGC_POINTER_COMPRESSION)
57
58void UnifiedHeapMarkingVisitorBase::VisitMultipleCompressedMember(
59 const void* start, size_t len,
60 TraceDescriptorCallback get_trace_descriptor) {
61 const char* it = static_cast<const char*>(start);
62 const char* end = it + len * cppgc::internal::kSizeofCompressedMember;
63 for (; it < end; it += cppgc::internal::kSizeofCompressedMember) {
64 const auto* current =
65 reinterpret_cast<const cppgc::internal::CompressedPointer*>(it);
66 const void* object = current->LoadAtomic();
67 if (!object) continue;
68
69 marking_state_.MarkAndPush(object, get_trace_descriptor(object));
70 }
71}
72
73#endif // defined(CPPGC_POINTER_COMPRESSION)
74
76 TraceDescriptor desc,
77 WeakCallback weak_callback,
78 const void* weak_member) {
79 marking_state_.RegisterWeakReferenceIfNeeded(object, desc, weak_callback,
80 weak_member);
81}
82
84 const void* value,
85 TraceDescriptor value_desc) {
86 marking_state_.ProcessEphemeron(key, value, value_desc, *this);
87}
88
90 const void* self, TraceDescriptor strong_desc, TraceDescriptor weak_desc,
91 WeakCallback callback, const void* data) {
92 marking_state_.ProcessWeakContainer(self, weak_desc, callback, data);
93}
94
99
103
107
109 HeapBase& heap, MutatorMarkingState& marking_state,
110 UnifiedHeapMarkingState& unified_heap_marking_state)
111 : UnifiedHeapMarkingVisitorBase(heap, marking_state,
112 unified_heap_marking_state) {}
113
115 HeapBase& heap, Heap* v8_heap,
117 CppHeap::CollectionType collection_type)
118 : UnifiedHeapMarkingVisitorBase(heap, marking_state,
119 concurrent_unified_heap_marking_state_),
120 local_marking_worklist_(GetV8MarkingWorklists(v8_heap, collection_type)),
121 concurrent_unified_heap_marking_state_(
122 v8_heap, local_marking_worklist_.get(), collection_type) {
123#ifdef V8_COMPRESS_POINTERS_IN_MULTIPLE_CAGES
124 // This method might be called on a thread that's not bound to any Isolate
125 // and thus IsolateGroup::current could be unset.
126 saved_isolate_group_ = IsolateGroup::current();
127 IsolateGroup::set_current(v8_heap->isolate()->isolate_group());
128#endif
129}
130
133 local_marking_worklist_->Publish();
134 }
135#ifdef V8_COMPRESS_POINTERS_IN_MULTIPLE_CAGES
136 IsolateGroup::set_current(saved_isolate_group_);
137#endif
138}
139
141 const void* parameter, cppgc::TraceCallback callback,
142 size_t deferred_size) {
144 {parameter, callback, deferred_size});
146 .AccountDeferredMarkedBytes(
147 cppgc::internal::BasePage::FromPayload(const_cast<void*>(parameter)),
148 deferred_size);
149 return true;
150}
151
152} // namespace internal
153} // namespace v8
static BasePage * FromPayload(void *)
Definition heap-page.h:314
void RegisterWeakCustomCallback(WeakCallback, const void *)
MarkingWorklists::ConcurrentMarkingBailoutWorklist::Local & concurrent_marking_bailout_worklist()
void RegisterWeakReferenceIfNeeded(const void *, TraceDescriptor, WeakCallback, const void *)
void RegisterMovableReference(const void **slot)
void ProcessEphemeron(const void *, const void *, TraceDescriptor, Visitor &)
void ProcessWeakContainer(const void *, TraceDescriptor, WeakCallback, const void *)
void MarkAndPush(const void *, TraceDescriptor)
V8_INLINE const void * LoadAtomic() const
std::unique_ptr< MarkingWorklists::Local > local_marking_worklist_
bool DeferTraceToMutatorThreadIfConcurrent(const void *, cppgc::TraceCallback, size_t) final
ConcurrentUnifiedHeapMarkingVisitor(HeapBase &, Heap *, cppgc::internal::ConcurrentMarkingState &, CppHeap::CollectionType)
Isolate * isolate() const
Definition heap-inl.h:61
static IsolateGroup * current()
IsolateGroup * isolate_group() const
Definition isolate.h:1230
MutatorUnifiedHeapMarkingVisitor(HeapBase &, MutatorMarkingState &, UnifiedHeapMarkingState &)
V8_INLINE void MarkAndPush(const TracedReferenceBase &)
UnifiedHeapMarkingVisitorBase(HeapBase &, cppgc::internal::BasicMarkingState &, UnifiedHeapMarkingState &)
void VisitMultipleUncompressedMember(const void *, size_t, TraceDescriptorCallback) final
void RegisterWeakCallback(WeakCallback, const void *) final
void VisitEphemeron(const void *, const void *, TraceDescriptor) final
void Visit(const void *, TraceDescriptor) final
void VisitWeak(const void *, TraceDescriptor, WeakCallback, const void *) final
cppgc::internal::BasicMarkingState & marking_state_
void VisitWeakContainer(const void *self, TraceDescriptor strong_desc, TraceDescriptor weak_desc, WeakCallback callback, const void *data) final
int start
int end
TNode< Object > callback
NonAtomicMarkingState * marking_state_
static constexpr size_t kSizeOfUncompressedMember
Definition member.h:621
void(*)(const LivenessBroker &, const void *) WeakCallback
Definition visitor.h:37
TraceDescriptor(*)(const void *address) TraceDescriptorCallback
Definition trace-trait.h:62
void(*)(Visitor *visitor, const void *object) TraceCallback
Definition trace-trait.h:38