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

commit e41000094dcc1b6e540c24c2b6841d9ffa902d39
Author: Andy Wingo <wi...@igalia.com>
AuthorDate: Mon Jan 13 10:23:47 2025 +0100

    Add missing write barriers to finalizers.c
---
 benchmarks/finalizers.c | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/benchmarks/finalizers.c b/benchmarks/finalizers.c
index 434283a53..537307118 100644
--- a/benchmarks/finalizers.c
+++ b/benchmarks/finalizers.c
@@ -93,6 +93,24 @@ static void cause_gc(struct gc_mutator *mut) {
   gc_collect(mut, GC_COLLECTION_MAJOR);
 }
 
+static inline void set_car(struct gc_mutator *mut, Pair *obj, void *val) {
+  void **field = &obj->car;
+  if (val)
+    gc_write_barrier(mut, gc_ref_from_heap_object(obj), sizeof(Pair),
+                     gc_edge(field),
+                     gc_ref_from_heap_object(val));
+  *field = val;
+}
+
+static inline void set_cdr(struct gc_mutator *mut, Pair *obj, void *val) {
+  void **field = &obj->cdr;
+  if (val)
+    gc_write_barrier(mut, gc_ref_from_heap_object(obj), sizeof(Pair),
+                     gc_edge(field),
+                     gc_ref_from_heap_object(val));
+  field = val;
+}
+
 static Pair* make_finalizer_chain(struct thread *t, size_t length) {
   PairHandle head = { NULL };
   PairHandle tail = { NULL };
@@ -102,8 +120,8 @@ static Pair* make_finalizer_chain(struct thread *t, size_t 
length) {
   for (size_t i = 0; i < length; i++) {
     HANDLE_SET(tail, HANDLE_REF(head));
     HANDLE_SET(head, allocate_pair(t->mut));
-    HANDLE_REF(head)->car = allocate_small_object(t->mut);
-    HANDLE_REF(head)->cdr = HANDLE_REF(tail);
+    set_car(t->mut, HANDLE_REF(head), allocate_small_object(t->mut));
+    set_cdr(t->mut, HANDLE_REF(head), HANDLE_REF(tail));
     struct gc_finalizer *finalizer = allocate_finalizer(t->mut);
     gc_finalizer_attach(t->mut, finalizer, 0,
                         gc_ref_from_heap_object(HANDLE_REF(head)),

Reply via email to