[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.
This commit is contained in:
Peter Zhu 2025-01-29 13:56:56 -05:00
parent 4cfc904d97
commit a084fef9af
Notes: git 2025-01-30 15:11:06 +00:00

15
gc.c
View File

@ -250,8 +250,19 @@ void
rb_gc_ractor_newobj_cache_foreach(void (*func)(void *cache, void *data), void *data) rb_gc_ractor_newobj_cache_foreach(void (*func)(void *cache, void *data), void *data)
{ {
rb_ractor_t *r = NULL; rb_ractor_t *r = NULL;
ccan_list_for_each(&GET_VM()->ractor.set, r, vmlr_node) { if (RB_LIKELY(ruby_single_main_ractor)) {
func(r->newobj_cache, data); 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);
}
} }
} }