diff --git a/mmtk/src/abi.rs b/mmtk/src/abi.rs index 3567b5f..e7640b0 100644 --- a/mmtk/src/abi.rs +++ b/mmtk/src/abi.rs @@ -342,8 +342,8 @@ pub struct RubyUpcalls { data: *mut libc::c_void, ), pub scan_vm_specific_roots: extern "C" fn(), - pub scan_thread_roots: extern "C" fn(), - pub scan_thread_root: extern "C" fn(mutator_tls: VMMutatorThread, worker_tls: VMWorkerThread), + pub scan_roots_in_mutator_thread: + extern "C" fn(mutator_tls: VMMutatorThread, worker_tls: VMWorkerThread), pub scan_object_ruby_style: extern "C" fn(object: ObjectReference), pub call_gc_mark_children: extern "C" fn(object: ObjectReference), pub call_obj_free: extern "C" fn(object: ObjectReference), diff --git a/mmtk/src/collection.rs b/mmtk/src/collection.rs index 3cf417a..2b788bb 100644 --- a/mmtk/src/collection.rs +++ b/mmtk/src/collection.rs @@ -1,5 +1,6 @@ use crate::abi::GCThreadTLS; +use crate::api::RubyMutator; use crate::{mmtk, upcalls, Ruby}; use mmtk::memory_manager; use mmtk::scheduler::*; @@ -10,12 +11,16 @@ use std::thread; pub struct VMCollection {} impl Collection for VMCollection { - fn stop_all_mutators(tls: VMWorkerThread, _mutator_visitor: F) + fn stop_all_mutators(tls: VMWorkerThread, mut mutator_visitor: F) where F: FnMut(&'static mut mmtk::Mutator), { (upcalls().stop_the_world)(tls); crate::binding().ppp_registry.pin_ppp_children(tls); + (upcalls().get_mutators)( + Self::notify_mutator_ready::, + &mut mutator_visitor as *mut F as *mut _, + ); } fn resume_mutators(tls: VMWorkerThread) { @@ -81,3 +86,14 @@ impl Collection for VMCollection { (upcalls().vm_live_bytes)() } } + +impl VMCollection { + extern "C" fn notify_mutator_ready(mutator_ptr: *mut RubyMutator, data: *mut libc::c_void) + where + F: FnMut(&'static mut mmtk::Mutator), + { + let mutator = unsafe { &mut *mutator_ptr }; + let mutator_visitor = unsafe { &mut *(data as *mut F) }; + mutator_visitor(mutator); + } +} diff --git a/mmtk/src/scanning.rs b/mmtk/src/scanning.rs index 032e33e..53ae710 100644 --- a/mmtk/src/scanning.rs +++ b/mmtk/src/scanning.rs @@ -62,7 +62,7 @@ impl Scanning for VMScanning { ) { let gc_tls = unsafe { GCThreadTLS::from_vwt_check(tls) }; Self::collect_object_roots_in("scan_thread_root", gc_tls, &mut factory, || { - (upcalls().scan_thread_root)(mutator.get_tls(), tls); + (upcalls().scan_roots_in_mutator_thread)(mutator.get_tls(), tls); }); } diff --git a/mmtk/src/weak_proc.rs b/mmtk/src/weak_proc.rs index 270d7bc..f63a58c 100644 --- a/mmtk/src/weak_proc.rs +++ b/mmtk/src/weak_proc.rs @@ -148,9 +148,11 @@ trait GlobalTableProcessingWork { // `hash_foreach_replace` depends on `gb_object_moved_p` which has to have the semantics // of `trace_object` due to the way it is used in `UPDATE_IF_MOVED`. let forward_object = |_worker, object: ObjectReference, _pin| { - debug_assert!(mmtk::memory_manager::is_mmtk_object( - VMObjectModel::ref_to_address(object) - ), "{} is not an MMTk object", object); + debug_assert!( + mmtk::memory_manager::is_mmtk_object(VMObjectModel::ref_to_address(object)), + "{} is not an MMTk object", + object + ); let result = object.forward(); trace!("Forwarding reference: {} -> {}", object, result); result