From cc0476127124aaf96552308bc36d67e289b8dd68 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Tue, 1 Oct 2024 14:36:55 +0200 Subject: [PATCH] gc_object_set_remembered returns nonzero on success --- api/gc-embedder-api.h | 2 +- benchmarks/simple-gc-embedder.h | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/api/gc-embedder-api.h b/api/gc-embedder-api.h index b176d7bef..7535ea7bc 100644 --- a/api/gc-embedder-api.h +++ b/api/gc-embedder-api.h @@ -54,7 +54,7 @@ GC_EMBEDDER_API inline void gc_trace_heap_roots(struct gc_heap_roots *roots, // are in the remembered set. Large or potentially large objects // (e.g. a vector whose size is a run-time property) must have a // remembered set bit. Small objects may or may not have such a bit. -GC_EMBEDDER_API inline void gc_object_set_remembered(struct gc_ref ref); +GC_EMBEDDER_API inline int gc_object_set_remembered(struct gc_ref ref); GC_EMBEDDER_API inline int gc_object_is_remembered_nonatomic(struct gc_ref ref); GC_EMBEDDER_API inline void gc_object_clear_remembered_nonatomic(struct gc_ref ref); diff --git a/benchmarks/simple-gc-embedder.h b/benchmarks/simple-gc-embedder.h index 683cc15ca..4e5fbb83d 100644 --- a/benchmarks/simple-gc-embedder.h +++ b/benchmarks/simple-gc-embedder.h @@ -102,11 +102,18 @@ static inline void gc_object_forward_nonatomic(struct gc_ref ref, *tag_word(ref) = gc_ref_value(new_ref); } -static inline void gc_object_set_remembered(struct gc_ref ref) { +static inline int gc_object_set_remembered(struct gc_ref ref) { uintptr_t *loc = tag_word(ref); - uintptr_t tag = *loc; - while (!(tag & gcobj_remembered_bit)) - atomic_compare_exchange_weak(loc, &tag, tag | gcobj_remembered_bit); + uintptr_t tag = atomic_load_explicit(loc, memory_order_relaxed); + while (1) { + if (tag & gcobj_remembered_bit) + return 0; + if (atomic_compare_exchange_weak_explicit(loc, &tag, + tag | gcobj_remembered_bit, + memory_order_acq_rel, + memory_order_acquire)) + return 1; + } } static inline int gc_object_is_remembered_nonatomic(struct gc_ref ref) {