5#ifndef INCLUDE_CPPGC_INTERNAL_WRITE_BARRIER_H_
6#define INCLUDE_CPPGC_INTERNAL_WRITE_BARRIER_H_
11#include "cppgc/heap-handle.h"
12#include "cppgc/heap-state.h"
13#include "cppgc/internal/api-constants.h"
14#include "cppgc/internal/atomic-entry-flag.h"
15#include "cppgc/internal/base-page-handle.h"
16#include "cppgc/internal/member-storage.h"
17#include "cppgc/platform.h"
18#include "cppgc/sentinel-pointer.h"
19#include "cppgc/trace-trait.h"
22#if defined(CPPGC_CAGED_HEAP)
23#include "cppgc/internal/caged-heap-local-data.h"
24#include "cppgc/internal/caged-heap.h"
33#if defined(CPPGC_CAGED_HEAP)
36class WriteBarrierTypeForNonCagedHeapPolicy;
58#if defined(CPPGC_CAGED_HEAP)
73 template <
typename MemberStorage>
77 template <
typename HeapHandleCallback>
79 HeapHandleCallback callback);
83#ifdef CPPGC_SLIM_WRITE_BARRIER
87 template <WriteBarrierSlotType>
88 static V8_NOINLINE
void V8_PRESERVE_MOST
89 CombinedWriteBarrierSlow(
const void* slot);
95 const Params& params,
const void* first_element, size_t element_size,
96 size_t number_of_elements, TraceCallback trace_callback);
99#if defined(CPPGC_YOUNG_GENERATION)
100 template <GenerationalBarrierType>
101 static V8_INLINE
void GenerationalBarrier(
const Params& params,
110 static void CheckParams(Type expected_type,
const Params& params);
121 WriteBarrier() =
delete;
123#if defined(CPPGC_CAGED_HEAP)
124 using WriteBarrierTypePolicy = WriteBarrierTypeForCagedHeapPolicy;
126 using WriteBarrierTypePolicy = WriteBarrierTypeForNonCagedHeapPolicy;
129 static void DijkstraMarkingBarrierSlow(
const void* value);
130 static void DijkstraMarkingBarrierSlowWithSentinelCheck(
const void* value);
131 static void DijkstraMarkingBarrierRangeSlow(
HeapHandle& heap_handle,
132 const void* first_element,
134 size_t number_of_elements,
135 TraceCallback trace_callback);
136 static void SteeleMarkingBarrierSlow(
const void* value);
137 static void SteeleMarkingBarrierSlowWithSentinelCheck(
const void* value);
139#if defined(CPPGC_YOUNG_GENERATION)
140 static CagedHeapLocalData& GetLocalData(HeapHandle&);
141 static void GenerationalBarrierSlow(
const CagedHeapLocalData& local_data,
142 const AgeTable& age_table,
143 const void* slot, uintptr_t value_offset,
144 HeapHandle* heap_handle);
145 static void GenerationalBarrierForUncompressedSlotSlow(
146 const CagedHeapLocalData& local_data,
const AgeTable& age_table,
147 const void* slot, uintptr_t value_offset, HeapHandle* heap_handle);
148 static void GenerationalBarrierForSourceObjectSlow(
149 const CagedHeapLocalData& local_data,
const void* object,
150 HeapHandle* heap_handle);
153 static AtomicEntryFlag write_barrier_enabled_;
156template <WriteBarrier::
Type type>
166#if defined(CPPGC_CAGED_HEAP)
255#if defined(CPPGC_YOUNG_GENERATION)
284#if defined(CPPGC_YOUNG_GENERATION)
309class V8_EXPORT WriteBarrierTypeForNonCagedHeapPolicy
final {
311 template <WriteBarrier::
ValueMode value_mode,
typename HeapHandleCallback>
313 WriteBarrier::
Params& params,
314 HeapHandleCallback callback) {
315 return ValueModeDispatch<value_mode>::Get(slot, value, params, callback);
318 template <WriteBarrier::
ValueMode value_mode,
typename HeapHandleCallback>
320 WriteBarrier::
Params& params,
321 HeapHandleCallback callback) {
322 return ValueModeDispatch<value_mode>::Get(slot, value
.Load(), params,
326 template <WriteBarrier::
ValueMode value_mode,
typename HeapHandleCallback>
328 WriteBarrier::
Params& params,
329 HeapHandleCallback callback) {
336 template <WriteBarrier::
ValueMode value_mode>
337 struct ValueModeDispatch;
339 WriteBarrierTypeForNonCagedHeapPolicy() =
delete;
343struct WriteBarrierTypeForNonCagedHeapPolicy::ValueModeDispatch<
345 template <
typename HeapHandleCallback>
347 WriteBarrier::
Params& params,
348 HeapHandleCallback callback) {
350 if (object <=
static_cast<
void*>(kSentinelPointer)) {
362 if (
V8_LIKELY(heap_handle.is_incremental_marking_in_progress())) {
370struct WriteBarrierTypeForNonCagedHeapPolicy::ValueModeDispatch<
372 template <
typename HeapHandleCallback>
374 WriteBarrier::
Params& params,
375 HeapHandleCallback callback) {
378 if (
V8_LIKELY(handle.is_incremental_marking_in_progress())) {
379 params
.heap = &handle;
389 const void* slot,
const void* value, WriteBarrier::
Params& params) {
395template <
typename MemberStorage>
397 const void* slot, MemberStorage value, WriteBarrier::
Params& params) {
403template <
typename HeapHandleCallback>
405 const void* slot, WriteBarrier::
Params& params,
406 HeapHandleCallback callback) {
408 slot,
nullptr, params, callback);
413 const void* value, WriteBarrier::
Params& params) {
420 const void* object) {
422#if defined(CPPGC_CAGED_HEAP)
424 DijkstraMarkingBarrierSlow(object);
426 DijkstraMarkingBarrierSlowWithSentinelCheck(object);
431void WriteBarrier::DijkstraMarkingBarrierRange(
const Params& params,
432 const void* first_element,
434 size_t number_of_elements,
435 TraceCallback trace_callback) {
437 DijkstraMarkingBarrierRangeSlow(*params
.heap, first_element, element_size,
438 number_of_elements, trace_callback);
443 const void* object) {
445#if defined(CPPGC_CAGED_HEAP)
447 SteeleMarkingBarrierSlow(object);
449 SteeleMarkingBarrierSlowWithSentinelCheck(object);
453#if defined(CPPGC_YOUNG_GENERATION)
473 }
else if constexpr (
type ==
bool MightBeEntered() const
HeapHandle & heap_handle()
static V8_INLINE BasePageHandle * FromPayload(void *payload)
V8_INLINE const void * Load() const
static V8_INLINE Type GetWriteBarrierType(const void *value, Params ¶ms)
static V8_INLINE void GenerationalBarrier(const Params ¶ms, const void *slot)
static V8_INLINE void DijkstraMarkingBarrier(const Params ¶ms, const void *object)
@ kPreciseUncompressedSlot
static V8_INLINE Type GetWriteBarrierType(const void *slot, const void *value, Params ¶ms)
static V8_INLINE void SteeleMarkingBarrier(const Params ¶ms, const void *object)
static void CheckParams(Type expected_type, const Params ¶ms)
static V8_INLINE Type GetWriteBarrierType(const void *slot, MemberStorage, Params ¶ms)
static V8_INLINE void DijkstraMarkingBarrierRange(const Params ¶ms, const void *first_element, size_t element_size, size_t number_of_elements, TraceCallback trace_callback)
static V8_INLINE Type GetWriteBarrierType(const void *slot, Params ¶ms, HeapHandleCallback callback)
static V8_INLINE WriteBarrier::Type Get(const void *slot, const void *value, WriteBarrier::Params ¶ms, HeapHandleCallback callback)
static V8_INLINE WriteBarrier::Type Get(const void *slot, RawPointer value, WriteBarrier::Params ¶ms, HeapHandleCallback callback)
static V8_INLINE WriteBarrier::Type Get(const void *value, WriteBarrier::Params ¶ms, HeapHandleCallback callback)
V8_INLINE WriteBarrier::Type SetAndReturnType(WriteBarrier::Params ¶ms)
static V8_INLINE WriteBarrier::Type Get(const void *, const void *object, WriteBarrier::Params ¶ms, HeapHandleCallback callback)
static V8_INLINE WriteBarrier::Type Get(const void *, const void *, WriteBarrier::Params ¶ms, HeapHandleCallback callback)
#define V8_LIKELY(condition)
#define V8_UNLIKELY(condition)