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));