|
9 | 9 |
|
10 | 10 | #include "include/cppgc/trace-trait.h" |
11 | 11 | #include "include/cppgc/visitor.h" |
| 12 | +#include "src/base/logging.h" |
12 | 13 | #include "src/heap/cppgc/compaction-worklists.h" |
13 | 14 | #include "src/heap/cppgc/globals.h" |
14 | 15 | #include "src/heap/cppgc/heap-object-header.h" |
@@ -123,6 +124,8 @@ class MarkingStateBase { |
123 | 124 | discovered_new_ephemeron_pairs_ = false; |
124 | 125 | } |
125 | 126 |
|
| 127 | + void set_in_atomic_pause() { in_atomic_pause_ = true; } |
| 128 | + |
126 | 129 | protected: |
127 | 130 | inline void MarkAndPush(HeapObjectHeader&, TraceDescriptor); |
128 | 131 |
|
@@ -160,6 +163,7 @@ class MarkingStateBase { |
160 | 163 | size_t marked_bytes_ = 0; |
161 | 164 | bool in_ephemeron_processing_ = false; |
162 | 165 | bool discovered_new_ephemeron_pairs_ = false; |
| 166 | + bool in_atomic_pause_ = false; |
163 | 167 | }; |
164 | 168 |
|
165 | 169 | MarkingStateBase::MarkingStateBase(HeapBase& heap, |
@@ -300,12 +304,19 @@ void MarkingStateBase::ProcessEphemeron(const void* key, const void* value, |
300 | 304 | // would break the main marking loop. |
301 | 305 | DCHECK(!in_ephemeron_processing_); |
302 | 306 | in_ephemeron_processing_ = true; |
303 | | - // Filter out already marked keys. The write barrier for WeakMember |
304 | | - // ensures that any newly set value after this point is kept alive and does |
305 | | - // not require the callback. |
306 | | - if (!HeapObjectHeader::FromObject(key) |
307 | | - .IsInConstruction<AccessMode::kAtomic>() && |
308 | | - HeapObjectHeader::FromObject(key).IsMarked<AccessMode::kAtomic>()) { |
| 307 | + // Keys are considered live even in incremental/concurrent marking settings |
| 308 | + // because the write barrier for WeakMember ensures that any newly set value |
| 309 | + // after this point is kept alive and does not require the callback. |
| 310 | + const bool key_in_construction = |
| 311 | + HeapObjectHeader::FromObject(key).IsInConstruction<AccessMode::kAtomic>(); |
| 312 | + const bool key_considered_as_live = |
| 313 | + key_in_construction |
| 314 | + ? in_atomic_pause_ |
| 315 | + : HeapObjectHeader::FromObject(key).IsMarked<AccessMode::kAtomic>(); |
| 316 | + DCHECK_IMPLIES( |
| 317 | + key_in_construction && in_atomic_pause_, |
| 318 | + HeapObjectHeader::FromObject(key).IsMarked<AccessMode::kAtomic>()); |
| 319 | + if (key_considered_as_live) { |
309 | 320 | if (value_desc.base_object_payload) { |
310 | 321 | MarkAndPush(value_desc.base_object_payload, value_desc); |
311 | 322 | } else { |
|
0 commit comments