From 149add89e38197c4ffc8cb4e8b96839909b29dd6 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Fri, 15 Aug 2025 10:11:45 -0700 Subject: Don't free Ractors in GC shutdown rb_gc_shutdown_call_finalizer_p returns false for threads and fibers, so it should probably do the same for all Ractors (not just the main one). This hopefully mitigates a bug where, at exit, rb_ractor_terminate_all gets all Ractors to stop before continuing with the shutdown process. However when vm->ractor.cnt reaches 1, the native threads may still be running code at the end co_start, which reads/locks on th->ractor->threads.sched, so the Ractor is not safe to free. A better solution might be to ensure that all native threads end up stopped or otherwise parked before this part of the shutdown, however that would be a bit more involved. --- gc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gc.c b/gc.c index fd4d8954fb..160398f9a6 100644 --- a/gc.c +++ b/gc.c @@ -343,7 +343,7 @@ rb_gc_shutdown_call_finalizer_p(VALUE obj) if (rb_obj_is_thread(obj)) return false; if (rb_obj_is_mutex(obj)) return false; if (rb_obj_is_fiber(obj)) return false; - if (rb_obj_is_main_ractor(obj)) return false; + if (rb_ractor_p(obj)) return false; if (rb_obj_is_fstring_table(obj)) return false; if (rb_obj_is_symbol_table(obj)) return false; -- cgit v1.2.3