From a084fef9afc7713aa4f4111f7e826c7ca1a607c7 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 29 Jan 2025 13:56:56 -0500 Subject: [PATCH] [Bug #21099] Fix GC when Ractor list not initialized When the Ractor list is not initialized and a GC is ran at boot, then it would crash because the newobj_cache of the main Ractor is not cleared. This commit changes it to use ruby_single_main_ractor when it's available and iterate over the Ractor list when we have multiple Ractors. --- gc.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/gc.c b/gc.c index afe2fc4b4a..1f9517db3d 100644 --- a/gc.c +++ b/gc.c @@ -250,8 +250,19 @@ void rb_gc_ractor_newobj_cache_foreach(void (*func)(void *cache, void *data), void *data) { rb_ractor_t *r = NULL; - ccan_list_for_each(&GET_VM()->ractor.set, r, vmlr_node) { - func(r->newobj_cache, data); + if (RB_LIKELY(ruby_single_main_ractor)) { + GC_ASSERT( + ccan_list_empty(&GET_VM()->ractor.set) || + (ccan_list_top(&GET_VM()->ractor.set, rb_ractor_t, vmlr_node) == ruby_single_main_ractor && + ccan_list_tail(&GET_VM()->ractor.set, rb_ractor_t, vmlr_node) == ruby_single_main_ractor) + ); + + func(ruby_single_main_ractor->newobj_cache, data); + } + else { + ccan_list_for_each(&GET_VM()->ractor.set, r, vmlr_node) { + func(r->newobj_cache, data); + } } }