|
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