wingo pushed a commit to branch wip-whippet
in repository guile.

commit cc0476127124aaf96552308bc36d67e289b8dd68
Author: Andy Wingo <wi...@igalia.com>
AuthorDate: Tue Oct 1 14:36:55 2024 +0200

    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) {

Reply via email to