5#ifndef V8_HEAP_CPPGC_MARKING_STATE_H_
6#define V8_HEAP_CPPGC_MARKING_STATE_H_
65 marking_worklist_(*marking_worklists.marking_worklist()),
66 not_fully_constructed_worklist_(
67 *marking_worklists.not_fully_constructed_worklist()) {}
127#if defined(CPPGC_CAGED_HEAP)
128 if (
V8_UNLIKELY(!CagedHeapBase::IsWithinCage(slot)))
return;
157 MarkingWorklists::PreviouslyNotFullyConstructedWorklist::Local&
161 MarkingWorklists::WeakCallbackWorklist::Local&
165 MarkingWorklists::WeakCallbackWorklist::Local&
169 MarkingWorklists::WeakCustomCallbackWorklist::Local&
176 MarkingWorklists::ConcurrentMarkingBailoutWorklist::Local&
180 MarkingWorklists::EphemeronPairsWorklist::Local&
184 MarkingWorklists::EphemeronPairsWorklist::Local&
192 CompactionWorklists::MovableReferencesWorklist::Local*
210 MarkingWorklists::PreviouslyNotFullyConstructedWorklist::Local
212 MarkingWorklists::WeakCallbackWorklist::Local
214 MarkingWorklists::WeakCallbackWorklist::Local
216 MarkingWorklists::WeakCustomCallbackWorklist::Local
219 MarkingWorklists::ConcurrentMarkingBailoutWorklist::Local
221 MarkingWorklists::EphemeronPairsWorklist::Local
223 MarkingWorklists::EphemeronPairsWorklist::Local
228 std::unique_ptr<CompactionWorklists::MovableReferencesWorklist::Local>
242 const void* parameter) {
255 const void*
object) {
261 const void*
object) {
316 const bool key_in_construction =
318 const bool key_considered_as_live =
325 if (key_considered_as_live) {
331 value_desc.
callback(&visitor, value);
352 size_t marked_bytes) {
367 return MutatorMarkingState::BasicMarkingState::MarkNoPush(header);
387 MarkingWorklists::RetraceMarkedObjectsWorklist::Local&
411 MarkingWorklists::RetraceMarkedObjectsWorklist::Local
436 const void* parameter) {
466 last_used_index_ = (last_used_index_ + 1) % kMaxCacheSize;
467 if (recently_retraced_cache_.size() <= last_used_index_)
468 recently_retraced_cache_.push_back(header);
470 recently_retraced_cache_[last_used_index_] = header;
482 size_t deferred_bytes) {
485 DCHECK_LE(deferred_bytes, marked_bytes_);
486 marked_bytes_ -= deferred_bytes;
487 marked_bytes_map_[base_page] -=
static_cast<int64_t
>(deferred_bytes);
491template <
size_t kDeadlineCheckInterval,
typename Predicate,
492 typename CreateStatsScopeCallback,
typename WorklistLocal,
493 typename ProcessWorklistItemCallback>
495 Predicate ShouldYield, CreateStatsScopeCallback CreateStatsScope,
496 WorklistLocal& worklist_local,
497 ProcessWorklistItemCallback ProcessWorklistItem) {
498 if (worklist_local.IsLocalAndGlobalEmpty()) {
504 const auto stats_scope = CreateStatsScope();
505 size_t processed_callback_count = kDeadlineCheckInterval;
506 typename WorklistLocal::ItemType item;
507 while (worklist_local.Pop(&item)) {
508 ProcessWorklistItem(item);
509 if (
V8_UNLIKELY(--processed_callback_count == 0)) {
513 processed_callback_count = kDeadlineCheckInterval;
519template <AccessMode mode>
HeapObjectHeader & ObjectHeaderFromInnerAddress(void *address) const
static BasePage * FromPayload(void *)
bool DidDiscoverNewEphemeronPairs() const
MarkingWorklists::EphemeronPairsWorklist::Local & ephemeron_pairs_for_processing_worklist()
BasicMarkingState(HeapBase &heap, MarkingWorklists &, CompactionWorklists *)
void RegisterWeakCustomCallback(WeakCallback, const void *)
MarkingWorklists::EphemeronPairsWorklist::Local discovered_ephemeron_pairs_worklist_
V8_EXPORT_PRIVATE void Publish() override
MarkingWorklists::ConcurrentMarkingBailoutWorklist::Local & concurrent_marking_bailout_worklist()
heap::base::CachedUnorderedMap< BasePage *, int64_t, v8::base::hash< BasePage * > > marked_bytes_map_
void RegisterWeakReferenceIfNeeded(const void *, TraceDescriptor, WeakCallback, const void *)
MarkingWorklists::WeakCallbackWorklist::Local & weak_container_callback_worklist()
size_t marked_bytes() const
MarkingWorklists::WriteBarrierWorklist::Local & write_barrier_worklist()
void set_in_atomic_pause()
MarkingWorklists::WeakCallbackWorklist::Local & parallel_weak_callback_worklist()
MarkingWorklists::EphemeronPairsWorklist::Local & discovered_ephemeron_pairs_worklist()
~BasicMarkingState() override
void RegisterMovableReference(const void **slot)
void ResetDidDiscoverNewEphemeronPairs()
MarkingWorklists::WeakContainersWorklist & weak_containers_worklist()
std::unique_ptr< CompactionWorklists::MovableReferencesWorklist::Local > movable_slots_worklist_
MarkingWorklists::WriteBarrierWorklist::Local write_barrier_worklist_
MarkingWorklists::WeakCustomCallbackWorklist::Local & weak_custom_callback_worklist()
MarkingWorklists::PreviouslyNotFullyConstructedWorklist::Local previously_not_fully_constructed_worklist_
BasicMarkingState & operator=(const BasicMarkingState &)=delete
MarkingWorklists::WeakContainersWorklist & weak_containers_worklist_
size_t RecentlyMarkedBytes()
void RegisterWeakContainerCallback(WeakCallback, const void *)
CompactionWorklists::MovableReferencesWorklist::Local * movable_slots_worklist()
void ProcessEphemeron(const void *, const void *, TraceDescriptor, Visitor &)
size_t last_marked_bytes_
void ProcessWeakContainer(const void *, TraceDescriptor, WeakCallback, const void *)
void RegisterWeakContainer(HeapObjectHeader &)
MarkingWorklists::EphemeronPairsWorklist::Local ephemeron_pairs_for_processing_worklist_
MarkingWorklists::WeakCustomCallbackWorklist::Local weak_custom_callback_worklist_
bool in_ephemeron_processing_
BasicMarkingState(const BasicMarkingState &)=delete
bool discovered_new_ephemeron_pairs_
MarkingWorklists::PreviouslyNotFullyConstructedWorklist::Local & previously_not_fully_constructed_worklist()
MarkingWorklists::ConcurrentMarkingBailoutWorklist::Local concurrent_marking_bailout_worklist_
MarkingWorklists::WeakCallbackWorklist::Local weak_container_callback_worklist_
void AccountMarkedBytes(const HeapObjectHeader &)
MarkingWorklists::WeakCallbackWorklist::Local parallel_weak_callback_worklist_
~ConcurrentMarkingState() override=default
void AccountDeferredMarkedBytes(BasePage *base_page, size_t deferred_bytes)
ConcurrentMarkingState(HeapBase &heap, MarkingWorklists &marking_worklists, CompactionWorklists *compaction_worklists)
static const GCInfo & GCInfoFromIndex(GCInfoIndex index)
size_t PayloadSize() const
static LivenessBroker Create()
virtual V8_EXPORT_PRIVATE void Publish()
MarkingStateBase(const MarkingStateBase &)=delete
MarkingWorklists::MarkingWorklist::Local & marking_worklist()
MarkingWorklists::MarkingWorklist::Local marking_worklist_
void MarkAndPush(const void *, TraceDescriptor)
void PushMarked(HeapObjectHeader &, TraceDescriptor desc)
virtual ~MarkingStateBase()=default
MarkingWorklists::NotFullyConstructedWorklist & not_fully_constructed_worklist_
MarkingStateBase & operator=(const MarkingStateBase &)=delete
MarkingWorklists::NotFullyConstructedWorklist & not_fully_constructed_worklist()
bool MarkNoPush(HeapObjectHeader &)
MarkingStateBase(HeapBase &, MarkingWorklists &)
bool Contains(HeapObjectHeader *)
void Push(HeapObjectHeader *)
void Insert(const HeapObjectHeader *)
static constexpr size_t kMaxCacheSize
bool Contains(const HeapObjectHeader *) const
std::vector< const HeapObjectHeader * > recently_retraced_cache_
void DynamicallyMarkAddress(ConstAddress)
void InvokeWeakRootsCallbackIfNeeded(const void *, TraceDescriptor, WeakCallback, const void *)
class cppgc::internal::MutatorMarkingState::RecentlyRetracedWeakContainers recently_retraced_weak_containers_
bool IsMarkedWeakContainer(HeapObjectHeader &)
MutatorMarkingState(HeapBase &heap, MarkingWorklists &marking_worklists, CompactionWorklists *compaction_worklists)
void ReTraceMarkedWeakContainer(cppgc::Visitor &, HeapObjectHeader &)
V8_EXPORT_PRIVATE void Publish() override
MarkingWorklists::RetraceMarkedObjectsWorklist::Local & retrace_marked_objects_worklist()
bool MarkNoPush(HeapObjectHeader &header)
~MutatorMarkingState() override=default
void FlushNotFullyConstructedObjects()
MarkingWorklists::RetraceMarkedObjectsWorklist::Local retrace_marked_objects_worklist_
void FlushDiscoveredEphemeronPairs()
static bool IsOnStack(const void *slot)
ZoneVector< RpoNumber > & result
void DynamicallyTraceMarkedObject(Visitor &visitor, const HeapObjectHeader &header)
bool DrainWorklistWithPredicate(Predicate ShouldYield, CreateStatsScopeCallback CreateStatsScope, WorklistLocal &worklist_local, ProcessWorklistItemCallback ProcessWorklistItem)
const uint8_t * ConstAddress
void(*)(const LivenessBroker &, const void *) WeakCallback
#define DCHECK_LE(v1, v2)
#define DCHECK_NOT_NULL(val)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define V8_EXPORT_PRIVATE
const void * base_object_payload
#define V8_LIKELY(condition)
#define V8_UNLIKELY(condition)
std::unique_ptr< ValueMirror > value
std::unique_ptr< ValueMirror > key