From e41000094dcc1b6e540c24c2b6841d9ffa902d39 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Mon, 13 Jan 2025 10:23:47 +0100 Subject: [PATCH] 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)),