From 5bead167c5cdd66ab88e3a6ddfd7913e24a861da Mon Sep 17 00:00:00 2001 From: Matt Valentine-House Date: Mon, 26 Oct 2026 21:24:57 +0000 Subject: [PATCH] Sync the zombie objspace hook with Ruby master Also vendor latest headers --- gc/gc.h | 3 --- gc/gc_impl.h | 8 ++++++-- gc/mmtk/mmtk.c | 5 ++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/gc/gc.h b/gc/gc.h index 64f29a0..6864594 100644 --- a/gc/gc.h +++ b/gc/gc.h @@ -79,10 +79,7 @@ MODULAR_GC_FN void rb_gc_vm_each_objspace(void (*func)(void *objspace, void *dat MODULAR_GC_FN void rb_gc_each_registered_addr(rb_gc_registered_addr_cb func, void *data); /* Verifier support, valid only with the world stopped (no extra locking inside). */ MODULAR_GC_FN bool rb_gc_registered_addr_owned_by_registrant_p(VALUE *addr, void *objspace); -MODULAR_GC_FN bool rb_gc_vm_zombie_objspace_p(void *objspace); -MODULAR_GC_FN size_t rb_gc_vm_zombie_total_pages(void); MODULAR_GC_FN unsigned int rb_gc_vm_ractor_count(void); -MODULAR_GC_FN void rb_gc_vm_refresh_zombie_pages(void); /* No MODULAR_GC_FN: the VM side (ractor.c) calls this too, so it needs external * linkage even in a non-modular build (see internal/gc.h). */ bool rb_gc_single_objspace_p(void); diff --git a/gc/gc_impl.h b/gc/gc_impl.h index 1bcb744..95ac884 100644 --- a/gc/gc_impl.h +++ b/gc/gc_impl.h @@ -153,7 +153,11 @@ GC_IMPL_FN bool rb_gc_impl_during_postmortem_p(void *objspace_ptr); * objspace impl. */ GC_IMPL_FN bool rb_gc_impl_obj_foreign_p(void *objspace_ptr, VALUE obj); GC_IMPL_FN bool rb_gc_impl_shref_marked_p(void *objspace_ptr, VALUE obj); -GC_IMPL_FN size_t rb_gc_impl_zombie_heap_page_count(void *objspace_ptr); +/* gc.c parked objspace_ptr in its zombie table: a terminated Ractor's objspace that + * rb_gc_impl_objspace_absorb later merges. Called under the VM lock, possibly from + * inside a global GC sweep (an unjoined Ractor's dfree disowns its objspace), so it + * must not allocate through the GC or expect to take a barrier. */ +GC_IMPL_FN void rb_gc_impl_objspace_zombify(void *objspace_ptr); GC_IMPL_FN void rb_gc_impl_objspace_absorb(void *dst_ptr, void *src_ptr); GC_IMPL_FN void rb_gc_impl_each_object(void *objspace_ptr, void (*func)(VALUE obj, void *data), void *data); // Finalizers @@ -172,7 +176,7 @@ GC_IMPL_FN unsigned long long rb_gc_impl_get_total_time(void *objspace_ptr); GC_IMPL_FN size_t rb_gc_impl_gc_count(void *objspace_ptr); GC_IMPL_FN VALUE rb_gc_impl_latest_gc_info(void *objspace_ptr, VALUE key); /* A NULL objspace requests cumulative process-wide statistics. Collectors that - * do not support this scope must raise NotImplementedError. */ + * do not support them must raise NotImplementedError. */ GC_IMPL_FN VALUE rb_gc_impl_stat(void *objspace_ptr, VALUE hash_or_sym); GC_IMPL_FN VALUE rb_gc_impl_stat_heap(void *objspace_ptr, VALUE heap_name, VALUE hash_or_sym); GC_IMPL_FN const char *rb_gc_impl_active_gc_name(void); diff --git a/gc/mmtk/mmtk.c b/gc/mmtk/mmtk.c index c379354..9679817 100644 --- a/gc/mmtk/mmtk.c +++ b/gc/mmtk/mmtk.c @@ -1858,11 +1858,10 @@ rb_gc_impl_shref_marked_p(void *objspace_ptr, VALUE obj) return true; } -size_t -rb_gc_impl_zombie_heap_page_count(void *objspace_ptr) +void +rb_gc_impl_objspace_zombify(void *objspace_ptr) { /* With a single objspace zombie_objspaces is always empty. */ - return 0; } void