blob: 83e682761284559aecf763906101a45c3b30e9d3 [file] [log] [blame]
// Copyright 2020 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef V8_HEAP_CPPGC_JS_UNIFIED_HEAP_MARKING_VISITOR_H_
#define V8_HEAP_CPPGC_JS_UNIFIED_HEAP_MARKING_VISITOR_H_
#include "include/cppgc/trace-trait.h"
#include "include/v8-cppgc.h"
#include "src/base/macros.h"
#include "src/heap/cppgc-js/unified-heap-marking-state.h"
#include "src/heap/cppgc/marking-visitor.h"
namespace cppgc {
namespace internal {
class ConcurrentMarkingState;
class BasicMarkingState;
class MutatorMarkingState;
} // namespace internal
} // namespace cppgc
namespace v8 {
class SourceLocation;
namespace internal {
using cppgc::TraceDescriptor;
using cppgc::TraceDescriptorCallback;
using cppgc::WeakCallback;
using cppgc::internal::HeapBase;
using cppgc::internal::MutatorMarkingState;
class UnifiedHeapMarker;
class V8_EXPORT_PRIVATE UnifiedHeapMarkingVisitorBase : public JSVisitor {
public:
UnifiedHeapMarkingVisitorBase(HeapBase&, cppgc::internal::BasicMarkingState&,
UnifiedHeapMarkingState&);
~UnifiedHeapMarkingVisitorBase() override = default;
protected:
// C++ handling.
void Visit(const void*, TraceDescriptor) final;
void VisitMultipleUncompressedMember(const void*, size_t,
TraceDescriptorCallback) final;
#if defined(CPPGC_POINTER_COMPRESSION)
void VisitMultipleCompressedMember(const void*, size_t,
TraceDescriptorCallback) final;
#endif // defined(CPPGC_POINTER_COMPRESSION)
void VisitWeak(const void*, TraceDescriptor, WeakCallback, const void*) final;
void VisitEphemeron(const void*, const void*, TraceDescriptor) final;
void VisitWeakContainer(const void* self, TraceDescriptor strong_desc,
TraceDescriptor weak_desc, WeakCallback callback,
const void* data) final;
void RegisterWeakCallback(WeakCallback, const void*) final;
void HandleMovableReference(const void**) final;
// JS handling.
void Visit(const TracedReferenceBase& ref) override;
cppgc::internal::BasicMarkingState& marking_state_;
UnifiedHeapMarkingState& unified_heap_marking_state_;
friend class UnifiedHeapMarker;
};
class V8_EXPORT_PRIVATE MutatorUnifiedHeapMarkingVisitor
: public UnifiedHeapMarkingVisitorBase {
public:
MutatorUnifiedHeapMarkingVisitor(HeapBase&, MutatorMarkingState&,
UnifiedHeapMarkingState&);
~MutatorUnifiedHeapMarkingVisitor() override = default;
};
class V8_EXPORT_PRIVATE ConcurrentUnifiedHeapMarkingVisitor
: public UnifiedHeapMarkingVisitorBase {
public:
ConcurrentUnifiedHeapMarkingVisitor(HeapBase&, Heap*,
cppgc::internal::ConcurrentMarkingState&,
CppHeap::CollectionType);
~ConcurrentUnifiedHeapMarkingVisitor() override;
protected:
bool DeferTraceToMutatorThreadIfConcurrent(const void*, cppgc::TraceCallback,
size_t) final;
bool IsConcurrent() const final { return true; }
private:
// Visitor owns the local worklist. All remaining items are published on
// destruction of the visitor. This is good enough as concurrent visitation
// ends before computing the rest of the transitive closure on the main
// thread. Dynamically allocated as it is only present when the heaps are
// attached.
std::unique_ptr<MarkingWorklists::Local> local_marking_worklist_;
UnifiedHeapMarkingState concurrent_unified_heap_marking_state_;
std::optional<SetCurrentIsolateScope> current_isolate_scope_;
#ifdef V8_COMPRESS_POINTERS_IN_MULTIPLE_CAGES
IsolateGroup* saved_isolate_group_ = nullptr;
#endif
};
} // namespace internal
} // namespace v8
#endif // V8_HEAP_CPPGC_JS_UNIFIED_HEAP_MARKING_VISITOR_H_