From 6e8ad619249fb9c2783fff2024ef4846dc4cdcde Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 28 Oct 2026 11:06:00 +0900 Subject: [PATCH] Register pinned root objects in PinningRegistry We need to register objects pinned from the root in PinningRegistry for rb_gc_impl_pinned_p to work properly. --- gc/mmtk/src/pinning_registry.rs | 7 +++++++ gc/mmtk/src/scanning.rs | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/gc/mmtk/src/pinning_registry.rs b/gc/mmtk/src/pinning_registry.rs index 7b295d4..bd51148 100644 --- a/gc/mmtk/src/pinning_registry.rs +++ b/gc/mmtk/src/pinning_registry.rs @@ -30,6 +30,13 @@ impl PinningRegistry { pinning_objs.push(object); } + pub fn register_pinned_obj(&self, object: ObjectReference) { + if memory_manager::pin_object(object) { + let mut pinned_objs = self.pinned_objs.lock().unwrap(); + pinned_objs.push(object); + } + } + pub fn pin_children(&self, tls: VMWorkerThread) { if !crate::mmtk().get_plan().current_gc_may_move_object() { log::debug!("The current GC is non-moving, skipping pinning children."); diff --git a/gc/mmtk/src/scanning.rs b/gc/mmtk/src/scanning.rs index 7b59483..37ecefc 100644 --- a/gc/mmtk/src/scanning.rs +++ b/gc/mmtk/src/scanning.rs @@ -194,6 +194,11 @@ impl VMScanning { mmtk::memory_manager::is_mmtk_object(object.to_raw_address()).is_some(), "Root does not point to MMTk object. object: {object}" ); + if pin && crate::mmtk().get_plan().current_gc_may_move_object() { + crate::binding() + .pinning_registry + .register_pinned_obj(object); + } buffer.push(object); if buffer.len() >= Self::OBJECT_BUFFER_SIZE { factory.create_process_pinning_roots_work(std::mem::take(&mut buffer));