diff --git a/mmtk/Cargo.lock b/mmtk/Cargo.lock index 3576ce56..74084aa8 100644 --- a/mmtk/Cargo.lock +++ b/mmtk/Cargo.lock @@ -13,47 +13,48 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.13" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" dependencies = [ "windows-sys", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" dependencies = [ "anstyle", "windows-sys", @@ -86,9 +87,9 @@ checksum = "41e67cd8309bbd06cd603a9e693a784ac2e5d1e955f11286e355089fcab3047c" [[package]] name = "autocfg" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "bitflags" @@ -107,9 +108,9 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" +checksum = "78834c15cb5d5efe3452d58b1e8ba890dd62d21907f867f383358198e56ebca5" dependencies = [ "bytemuck_derive", ] @@ -122,14 +123,14 @@ checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.65", ] [[package]] name = "cc" -version = "1.0.95" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" +checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" dependencies = [ "jobserver", "libc", @@ -144,9 +145,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" [[package]] name = "core-foundation-sys" @@ -169,9 +170,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" dependencies = [ "crossbeam-utils", ] @@ -206,9 +207,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "delegate" @@ -218,7 +219,7 @@ checksum = "4e018fccbeeb50ff26562ece792ed06659b9c2dae79ece77c4456bb10d9bf79b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.65", ] [[package]] @@ -229,9 +230,9 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "either" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" +checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" [[package]] name = "enum-map" @@ -250,7 +251,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.65", ] [[package]] @@ -337,6 +338,12 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" + [[package]] name = "itertools" version = "0.12.1" @@ -363,9 +370,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libgit2-sys" @@ -425,7 +432,7 @@ dependencies = [ [[package]] name = "mmtk" version = "0.25.0" -source = "git+https://github.com/mmtk/mmtk-core.git?rev=dccce9063b57dde96d2e97670297aed4dc32e6e1#dccce9063b57dde96d2e97670297aed4dc32e6e1" +source = "git+https://github.com/mmtk/mmtk-core.git?rev=56b2521d2b99848ee0613a0a5288fe6d81b754ba#56b2521d2b99848ee0613a0a5288fe6d81b754ba" dependencies = [ "atomic", "atomic-traits", @@ -460,12 +467,12 @@ dependencies = [ [[package]] name = "mmtk-macros" version = "0.25.0" -source = "git+https://github.com/mmtk/mmtk-core.git?rev=dccce9063b57dde96d2e97670297aed4dc32e6e1#dccce9063b57dde96d2e97670297aed4dc32e6e1" +source = "git+https://github.com/mmtk/mmtk-core.git?rev=56b2521d2b99848ee0613a0a5288fe6d81b754ba#56b2521d2b99848ee0613a0a5288fe6d81b754ba" dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.60", + "syn 2.0.65", ] [[package]] @@ -492,9 +499,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] @@ -565,9 +572,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.81" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" dependencies = [ "unicode-ident", ] @@ -641,9 +648,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "scopeguard" @@ -653,9 +660,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "spin" @@ -688,7 +695,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.60", + "syn 2.0.65", ] [[package]] @@ -703,9 +710,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.60" +version = "2.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" +checksum = "d2863d96a84c6439701d7a38f9de935ec562c8832cc55d1dde0f513b52fad106" dependencies = [ "proc-macro2", "quote", @@ -714,9 +721,9 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.30.11" +version = "0.30.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87341a165d73787554941cd5ef55ad728011566fe714e987d1b976c15dbc3a83" +checksum = "732ffa00f53e6b2af46208fba5718d9662a421049204e156328b66791ffa15ae" dependencies = [ "cfg-if", "core-foundation-sys", diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index 7b7c21a6..903b8faf 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -32,7 +32,7 @@ memoffset = "0.9.0" # - change branch # - change repo name # But other changes including adding/removing whitespaces in commented lines may break the CI. -mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "dccce9063b57dde96d2e97670297aed4dc32e6e1" } +mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "56b2521d2b99848ee0613a0a5288fe6d81b754ba" } # Uncomment the following to build locally # mmtk = { path = "../repos/mmtk-core" } diff --git a/mmtk/src/abi.rs b/mmtk/src/abi.rs index 46d02042..1ff7bef9 100644 --- a/mmtk/src/abi.rs +++ b/mmtk/src/abi.rs @@ -1,5 +1,5 @@ use super::UPCALLS; -use crate::OpenJDKEdge; +use crate::OpenJDKSlot; use atomic::Atomic; use atomic::Ordering; use mmtk::util::constants::*; @@ -278,10 +278,10 @@ impl InstanceRefKlass { } *DISCOVERED_OFFSET } - pub fn referent_address(oop: Oop) -> OpenJDKEdge { + pub fn referent_address(oop: Oop) -> OpenJDKSlot { oop.get_field_address(Self::referent_offset()).into() } - pub fn discovered_address(oop: Oop) -> OpenJDKEdge { + pub fn discovered_address(oop: Oop) -> OpenJDKSlot { oop.get_field_address(Self::discovered_offset()).into() } } @@ -461,10 +461,10 @@ impl ArrayOopDesc { pub unsafe fn slice( &self, ty: BasicType, - ) -> crate::OpenJDKEdgeRange { + ) -> crate::OpenJDKSlotRange { let base = self.base::(ty); let start = base; - let lshift = OpenJDKEdge::::LOG_BYTES_IN_EDGE; + let lshift = OpenJDKSlot::::LOG_BYTES_IN_SLOT; let end = base + ((self.length::() as usize) << lshift); (start..end).into() } diff --git a/mmtk/src/api.rs b/mmtk/src/api.rs index ae78e026..203a74b5 100644 --- a/mmtk/src/api.rs +++ b/mmtk/src/api.rs @@ -1,4 +1,4 @@ -use crate::edges::OpenJDKEdge; +use crate::slots::OpenJDKSlot; use crate::OpenJDK; use crate::OpenJDK_Upcalls; use crate::BUILDER; @@ -254,7 +254,7 @@ pub extern "C" fn handle_user_collection_request(tls: VMMutatorThread) { #[no_mangle] pub extern "C" fn mmtk_enable_compressed_oops() { - crate::edges::enable_compressed_oops() + crate::slots::enable_compressed_oops() } #[no_mangle] @@ -366,13 +366,13 @@ pub extern "C" fn process_bulk(options: *const c_char) -> bool { #[no_mangle] pub extern "C" fn mmtk_narrow_oop_base() -> Address { debug_assert!(crate::use_compressed_oops()); - crate::edges::BASE.load(Ordering::Relaxed) + crate::slots::BASE.load(Ordering::Relaxed) } #[no_mangle] pub extern "C" fn mmtk_narrow_oop_shift() -> usize { debug_assert!(crate::use_compressed_oops()); - crate::edges::SHIFT.load(Ordering::Relaxed) + crate::slots::SHIFT.load(Ordering::Relaxed) } #[no_mangle] @@ -440,11 +440,11 @@ pub extern "C" fn mmtk_object_reference_write_slow( }) } -fn log_bytes_in_edge() -> usize { +fn log_bytes_in_slot() -> usize { if crate::use_compressed_oops() { - OpenJDKEdge::::LOG_BYTES_IN_EDGE + OpenJDKSlot::::LOG_BYTES_IN_SLOT } else { - OpenJDKEdge::::LOG_BYTES_IN_EDGE + OpenJDKSlot::::LOG_BYTES_IN_SLOT } } @@ -456,7 +456,7 @@ pub extern "C" fn mmtk_array_copy_pre( dst: Address, count: usize, ) { - let bytes = count << log_bytes_in_edge(); + let bytes = count << log_bytes_in_slot(); with_mutator!(|mutator| { mutator .barrier() @@ -473,7 +473,7 @@ pub extern "C" fn mmtk_array_copy_post( count: usize, ) { with_mutator!(|mutator| { - let bytes = count << log_bytes_in_edge(); + let bytes = count << log_bytes_in_slot(); mutator .barrier() .memory_region_copy_post((src..src + bytes).into(), (dst..dst + bytes).into()); diff --git a/mmtk/src/gc_work.rs b/mmtk/src/gc_work.rs index 4a33cc75..239e1ae5 100644 --- a/mmtk/src/gc_work.rs +++ b/mmtk/src/gc_work.rs @@ -1,8 +1,8 @@ use std::sync::atomic::Ordering; -use crate::scanning::to_edges_closure; +use crate::scanning::to_slots_closure; use crate::OpenJDK; -use crate::OpenJDKEdge; +use crate::OpenJDKSlot; use crate::UPCALLS; use mmtk::scheduler::*; use mmtk::vm::RootsWorkFactory; @@ -11,12 +11,12 @@ use mmtk::MMTK; macro_rules! scan_roots_work { ($struct_name: ident, $func_name: ident) => { - pub struct $struct_name> { + pub struct $struct_name> { factory: F, _p: std::marker::PhantomData, } - impl> $struct_name { + impl> $struct_name { pub fn new(factory: F) -> Self { Self { factory, @@ -25,10 +25,10 @@ macro_rules! scan_roots_work { } } - impl> GCWork for $struct_name { + impl> GCWork for $struct_name { fn do_work(&mut self, _worker: &mut GCWorker, _mmtk: &'static MMTK) { unsafe { - ((*UPCALLS).$func_name)(to_edges_closure(&mut self.factory)); + ((*UPCALLS).$func_name)(to_slots_closure(&mut self.factory)); } } } @@ -50,12 +50,12 @@ scan_roots_work!( scan_roots_work!(ScanWeakProcessorRoots, scan_weak_processor_roots); scan_roots_work!(ScanVMThreadRoots, scan_vm_thread_roots); -pub struct ScanCodeCacheRoots>> +pub struct ScanCodeCacheRoots>> { factory: F, } -impl>> +impl>> ScanCodeCacheRoots { pub fn new(factory: F) -> Self { @@ -63,7 +63,7 @@ impl>> } } -impl>> +impl>> GCWork> for ScanCodeCacheRoots { fn do_work( @@ -72,19 +72,19 @@ impl>> _mmtk: &'static MMTK>, ) { // Collect all the cached roots - let mut edges = Vec::with_capacity(crate::CODE_CACHE_ROOTS_SIZE.load(Ordering::Relaxed)); + let mut slots = Vec::with_capacity(crate::CODE_CACHE_ROOTS_SIZE.load(Ordering::Relaxed)); for roots in (*crate::CODE_CACHE_ROOTS.lock().unwrap()).values() { for r in roots { - edges.push((*r).into()) + slots.push((*r).into()) } } // Create work packet - if !edges.is_empty() { - self.factory.create_process_edge_roots_work(edges); + if !slots.is_empty() { + self.factory.create_process_roots_work(slots); } // Use the following code to scan CodeCache directly, instead of scanning the "remembered set". // unsafe { - // ((*UPCALLS).scan_code_cache_roots)(create_process_edges_work:: as _); + // ((*UPCALLS).scan_code_cache_roots)(to_slots_closure(&mut self.factory)); // } } } diff --git a/mmtk/src/lib.rs b/mmtk/src/lib.rs index a45ad4c3..e4259da9 100644 --- a/mmtk/src/lib.rs +++ b/mmtk/src/lib.rs @@ -6,29 +6,29 @@ use std::ptr::null_mut; use std::sync::atomic::AtomicUsize; use std::sync::Mutex; -pub use edges::use_compressed_oops; -use edges::{OpenJDKEdge, OpenJDKEdgeRange}; use libc::{c_char, c_void, uintptr_t}; use mmtk::util::alloc::AllocationError; use mmtk::util::constants::LOG_BYTES_IN_GBYTE; use mmtk::util::heap::vm_layout::VMLayout; use mmtk::util::{conversions, opaque_pointer::*}; use mmtk::util::{Address, ObjectReference}; -use mmtk::vm::edge_shape::Edge; +use mmtk::vm::slot::Slot; use mmtk::vm::VMBinding; use mmtk::{MMTKBuilder, Mutator, MMTK}; +pub use slots::use_compressed_oops; +use slots::{OpenJDKSlot, OpenJDKSlotRange}; mod abi; pub mod active_plan; pub mod api; mod build_info; pub mod collection; -mod edges; mod gc_work; pub mod object_model; mod object_scanning; pub mod reference_glue; pub mod scanning; +mod slots; pub(crate) mod vm_metadata; #[repr(C)] @@ -67,9 +67,9 @@ impl MutatorClosure { } } -/// A closure for reporting root edges. The C++ code should pass `data` back as the last argument. +/// A closure for reporting root slots. The C++ code should pass `data` back as the last argument. #[repr(C)] -pub struct EdgesClosure { +pub struct SlotsClosure { pub func: extern "C" fn( buf: *mut Address, size: usize, @@ -100,20 +100,20 @@ pub struct OpenJDK_Upcalls { pub referent_offset: extern "C" fn() -> i32, pub discovered_offset: extern "C" fn() -> i32, pub dump_object_string: extern "C" fn(object: ObjectReference) -> *const c_char, - pub scan_roots_in_all_mutator_threads: extern "C" fn(closure: EdgesClosure), - pub scan_roots_in_mutator_thread: extern "C" fn(closure: EdgesClosure, tls: VMMutatorThread), - pub scan_universe_roots: extern "C" fn(closure: EdgesClosure), - pub scan_jni_handle_roots: extern "C" fn(closure: EdgesClosure), - pub scan_object_synchronizer_roots: extern "C" fn(closure: EdgesClosure), - pub scan_management_roots: extern "C" fn(closure: EdgesClosure), - pub scan_jvmti_export_roots: extern "C" fn(closure: EdgesClosure), - pub scan_aot_loader_roots: extern "C" fn(closure: EdgesClosure), - pub scan_system_dictionary_roots: extern "C" fn(closure: EdgesClosure), - pub scan_code_cache_roots: extern "C" fn(closure: EdgesClosure), - pub scan_string_table_roots: extern "C" fn(closure: EdgesClosure), - pub scan_class_loader_data_graph_roots: extern "C" fn(closure: EdgesClosure), - pub scan_weak_processor_roots: extern "C" fn(closure: EdgesClosure), - pub scan_vm_thread_roots: extern "C" fn(closure: EdgesClosure), + pub scan_roots_in_all_mutator_threads: extern "C" fn(closure: SlotsClosure), + pub scan_roots_in_mutator_thread: extern "C" fn(closure: SlotsClosure, tls: VMMutatorThread), + pub scan_universe_roots: extern "C" fn(closure: SlotsClosure), + pub scan_jni_handle_roots: extern "C" fn(closure: SlotsClosure), + pub scan_object_synchronizer_roots: extern "C" fn(closure: SlotsClosure), + pub scan_management_roots: extern "C" fn(closure: SlotsClosure), + pub scan_jvmti_export_roots: extern "C" fn(closure: SlotsClosure), + pub scan_aot_loader_roots: extern "C" fn(closure: SlotsClosure), + pub scan_system_dictionary_roots: extern "C" fn(closure: SlotsClosure), + pub scan_code_cache_roots: extern "C" fn(closure: SlotsClosure), + pub scan_string_table_roots: extern "C" fn(closure: SlotsClosure), + pub scan_class_loader_data_graph_roots: extern "C" fn(closure: SlotsClosure), + pub scan_weak_processor_roots: extern "C" fn(closure: SlotsClosure), + pub scan_vm_thread_roots: extern "C" fn(closure: SlotsClosure), pub number_of_mutators: extern "C" fn() -> usize, pub schedule_finalizer: extern "C" fn(), pub prepare_for_roots_re_scanning: extern "C" fn(), @@ -148,8 +148,8 @@ impl VMBinding for OpenJDK { type VMActivePlan = active_plan::VMActivePlan; type VMReferenceGlue = reference_glue::VMReferenceGlue; - type VMEdge = OpenJDKEdge; - type VMMemorySlice = OpenJDKEdgeRange; + type VMSlot = OpenJDKSlot; + type VMMemorySlice = OpenJDKSlotRange; const MIN_ALIGNMENT: usize = 8; const MAX_ALIGNMENT: usize = 8; @@ -170,7 +170,7 @@ lazy_static! { set_compressed_pointer_vm_layout(&mut builder); let ret = mmtk::memory_manager::mmtk_init(&builder); MMTK_INITIALIZED.store(true, std::sync::atomic::Ordering::SeqCst); - edges::initialize_compressed_oops_base_and_shift(); + slots::initialize_compressed_oops_base_and_shift(); *ret }; pub static ref SINGLETON_UNCOMPRESSED: MMTK> = { diff --git a/mmtk/src/object_scanning.rs b/mmtk/src/object_scanning.rs index 1405e52d..56dbda6c 100644 --- a/mmtk/src/object_scanning.rs +++ b/mmtk/src/object_scanning.rs @@ -1,20 +1,20 @@ -use crate::OpenJDKEdge; +use crate::OpenJDKSlot; use super::abi::*; use super::UPCALLS; use mmtk::util::opaque_pointer::*; use mmtk::util::{Address, ObjectReference}; -use mmtk::vm::EdgeVisitor; +use mmtk::vm::SlotVisitor; use std::cell::UnsafeCell; use std::{mem, slice}; -type E = OpenJDKEdge; +type S = OpenJDKSlot; trait OopIterate: Sized { fn oop_iterate( &self, oop: Oop, - closure: &mut impl EdgeVisitor>, + closure: &mut impl SlotVisitor>, ); } @@ -22,13 +22,13 @@ impl OopIterate for OopMapBlock { fn oop_iterate( &self, oop: Oop, - closure: &mut impl EdgeVisitor>, + closure: &mut impl SlotVisitor>, ) { let log_bytes_in_oop = if COMPRESSED { 2 } else { 3 }; let start = oop.get_field_address(self.offset); for i in 0..self.count as usize { - let edge = (start + (i << log_bytes_in_oop)).into(); - closure.visit_edge(edge); + let slot = (start + (i << log_bytes_in_oop)).into(); + closure.visit_slot(slot); } } } @@ -37,7 +37,7 @@ impl OopIterate for InstanceKlass { fn oop_iterate( &self, oop: Oop, - closure: &mut impl EdgeVisitor>, + closure: &mut impl SlotVisitor>, ) { let oop_maps = self.nonstatic_oop_maps(); for map in oop_maps { @@ -50,7 +50,7 @@ impl OopIterate for InstanceMirrorKlass { fn oop_iterate( &self, oop: Oop, - closure: &mut impl EdgeVisitor>, + closure: &mut impl SlotVisitor>, ) { self.instance_klass.oop_iterate::(oop, closure); @@ -61,13 +61,13 @@ impl OopIterate for InstanceMirrorKlass { let start: *const NarrowOop = start.to_ptr::(); let slice = unsafe { slice::from_raw_parts(start, len as _) }; for narrow_oop in slice { - closure.visit_edge(narrow_oop.slot().into()); + closure.visit_slot(narrow_oop.slot().into()); } } else { let start: *const Oop = start.to_ptr::(); let slice = unsafe { slice::from_raw_parts(start, len as _) }; for oop in slice { - closure.visit_edge(Address::from_ref(oop as &Oop).into()); + closure.visit_slot(Address::from_ref(oop as &Oop).into()); } } } @@ -77,7 +77,7 @@ impl OopIterate for InstanceClassLoaderKlass { fn oop_iterate( &self, oop: Oop, - closure: &mut impl EdgeVisitor>, + closure: &mut impl SlotVisitor>, ) { self.instance_klass.oop_iterate::(oop, closure); } @@ -87,16 +87,16 @@ impl OopIterate for ObjArrayKlass { fn oop_iterate( &self, oop: Oop, - closure: &mut impl EdgeVisitor>, + closure: &mut impl SlotVisitor>, ) { let array = unsafe { oop.as_array_oop() }; if COMPRESSED { for narrow_oop in unsafe { array.data::(BasicType::T_OBJECT) } { - closure.visit_edge(narrow_oop.slot().into()); + closure.visit_slot(narrow_oop.slot().into()); } } else { for oop in unsafe { array.data::(BasicType::T_OBJECT) } { - closure.visit_edge(Address::from_ref(oop as &Oop).into()); + closure.visit_slot(Address::from_ref(oop as &Oop).into()); } } } @@ -106,7 +106,7 @@ impl OopIterate for TypeArrayKlass { fn oop_iterate( &self, _oop: Oop, - _closure: &mut impl EdgeVisitor>, + _closure: &mut impl SlotVisitor>, ) { // Performance tweak: We skip processing the klass pointer since all // TypeArrayKlasses are guaranteed processed via the null class loader. @@ -117,7 +117,7 @@ impl OopIterate for InstanceRefKlass { fn oop_iterate( &self, oop: Oop, - closure: &mut impl EdgeVisitor>, + closure: &mut impl SlotVisitor>, ) { use crate::abi::*; use crate::api::{add_phantom_candidate, add_soft_candidate, add_weak_candidate}; @@ -152,17 +152,17 @@ impl InstanceRefKlass { } fn process_ref_as_strong( oop: Oop, - closure: &mut impl EdgeVisitor>, + closure: &mut impl SlotVisitor>, ) { let referent_addr = Self::referent_address::(oop); - closure.visit_edge(referent_addr); + closure.visit_slot(referent_addr); let discovered_addr = Self::discovered_address::(oop); - closure.visit_edge(discovered_addr); + closure.visit_slot(discovered_addr); } } #[allow(unused)] -fn oop_iterate_slow>>( +fn oop_iterate_slow>>( oop: Oop, closure: &mut V, tls: OpaquePointer, @@ -171,7 +171,7 @@ fn oop_iterate_slow>>( CLOSURE.with(|x| *x.get() = closure as *mut V as *mut u8); ((*UPCALLS).scan_object)( mem::transmute( - scan_object_fn:: as *const unsafe extern "C" fn(edge: Address), + scan_object_fn:: as *const unsafe extern "C" fn(slot: Address), ), mem::transmute(oop), tls, @@ -179,7 +179,7 @@ fn oop_iterate_slow>>( } } -fn oop_iterate(oop: Oop, closure: &mut impl EdgeVisitor>) { +fn oop_iterate(oop: Oop, closure: &mut impl SlotVisitor>) { let klass = oop.klass::(); let klass_id = klass.id; assert!( @@ -221,18 +221,18 @@ thread_local! { pub unsafe extern "C" fn scan_object_fn< const COMPRESSED: bool, - V: EdgeVisitor>, + V: SlotVisitor>, >( - edge: Address, + slot: Address, ) { let ptr: *mut u8 = CLOSURE.with(|x| *x.get()); let closure = &mut *(ptr as *mut V); - closure.visit_edge(edge.into()); + closure.visit_slot(slot.into()); } pub fn scan_object( object: ObjectReference, - closure: &mut impl EdgeVisitor>, + closure: &mut impl SlotVisitor>, _tls: VMWorkerThread, ) { unsafe { oop_iterate::(mem::transmute(object), closure) } diff --git a/mmtk/src/reference_glue.rs b/mmtk/src/reference_glue.rs index 4e124ac6..179335de 100644 --- a/mmtk/src/reference_glue.rs +++ b/mmtk/src/reference_glue.rs @@ -3,7 +3,7 @@ use crate::OpenJDK; use crate::UPCALLS; use mmtk::util::opaque_pointer::VMWorkerThread; use mmtk::util::ObjectReference; -use mmtk::vm::edge_shape::Edge; +use mmtk::vm::slot::Slot; use mmtk::vm::ReferenceGlue; pub struct VMReferenceGlue {} diff --git a/mmtk/src/scanning.rs b/mmtk/src/scanning.rs index 5b3ee419..dc94cf87 100644 --- a/mmtk/src/scanning.rs +++ b/mmtk/src/scanning.rs @@ -1,12 +1,12 @@ use crate::gc_work::*; -use crate::Edge; -use crate::{EdgesClosure, OpenJDK}; -use crate::{NewBuffer, OpenJDKEdge, UPCALLS}; +use crate::Slot; +use crate::{NewBuffer, OpenJDKSlot, UPCALLS}; +use crate::{OpenJDK, SlotsClosure}; use mmtk::memory_manager; use mmtk::scheduler::WorkBucketStage; use mmtk::util::opaque_pointer::*; use mmtk::util::{Address, ObjectReference}; -use mmtk::vm::{EdgeVisitor, RootsWorkFactory, Scanning}; +use mmtk::vm::{RootsWorkFactory, Scanning, SlotVisitor}; use mmtk::Mutator; use mmtk::MutatorContext; @@ -14,18 +14,18 @@ pub struct VMScanning {} const WORK_PACKET_CAPACITY: usize = 4096; -extern "C" fn report_edges_and_renew_buffer>( +extern "C" fn report_slots_and_renew_buffer>( ptr: *mut Address, length: usize, capacity: usize, factory_ptr: *mut libc::c_void, ) -> NewBuffer { if !ptr.is_null() { - // Note: Currently OpenJDKEdge has the same layout as Address. If the layout changes, we + // Note: Currently OpenJDKSlot has the same layout as Address. If the layout changes, we // should fix the Rust-to-C interface. - let buf = unsafe { Vec::::from_raw_parts(ptr as _, length, capacity) }; + let buf = unsafe { Vec::::from_raw_parts(ptr as _, length, capacity) }; let factory: &mut F = unsafe { &mut *(factory_ptr as *mut F) }; - factory.create_process_edge_roots_work(buf); + factory.create_process_roots_work(buf); } let (ptr, _, capacity) = { // TODO: Use Vec::into_raw_parts() when the method is available. @@ -37,20 +37,20 @@ extern "C" fn report_edges_and_renew_buffer>( NewBuffer { ptr, capacity } } -pub(crate) fn to_edges_closure>(factory: &mut F) -> EdgesClosure { - EdgesClosure { - func: report_edges_and_renew_buffer::, +pub(crate) fn to_slots_closure>(factory: &mut F) -> SlotsClosure { + SlotsClosure { + func: report_slots_and_renew_buffer::, data: factory as *mut F as *mut libc::c_void, } } impl Scanning> for VMScanning { - fn scan_object>>( + fn scan_object>>( tls: VMWorkerThread, object: ObjectReference, - edge_visitor: &mut EV, + slot_visitor: &mut SV, ) { - crate::object_scanning::scan_object::(object, edge_visitor, tls); + crate::object_scanning::scan_object::(object, slot_visitor, tls); } fn notify_initial_thread_scan_complete(_partial_scan: bool, _tls: VMWorkerThread) { @@ -61,17 +61,17 @@ impl Scanning> for VMScanning { fn scan_roots_in_mutator_thread( _tls: VMWorkerThread, mutator: &'static mut Mutator>, - mut factory: impl RootsWorkFactory>, + mut factory: impl RootsWorkFactory>, ) { let tls = mutator.get_tls(); unsafe { - ((*UPCALLS).scan_roots_in_mutator_thread)(to_edges_closure(&mut factory), tls); + ((*UPCALLS).scan_roots_in_mutator_thread)(to_slots_closure(&mut factory), tls); } } fn scan_vm_specific_roots( _tls: VMWorkerThread, - factory: impl RootsWorkFactory>, + factory: impl RootsWorkFactory>, ) { memory_manager::add_work_packets( crate::singleton::(), diff --git a/mmtk/src/edges.rs b/mmtk/src/slots.rs similarity index 84% rename from mmtk/src/edges.rs rename to mmtk/src/slots.rs index b1395c97..e299247e 100644 --- a/mmtk/src/edges.rs +++ b/mmtk/src/slots.rs @@ -7,7 +7,7 @@ use super::abi::LOG_BYTES_IN_INT; use atomic::Atomic; use mmtk::{ util::{constants::LOG_BYTES_IN_WORD, Address, ObjectReference}, - vm::edge_shape::{Edge, MemorySlice}, + vm::slot::{MemorySlice, Slot}, }; static USE_COMPRESSED_OOPS: AtomicBool = AtomicBool::new(false); @@ -54,13 +54,13 @@ pub fn initialize_compressed_oops_base_and_shift() { } } -/// The type of edges in OpenJDK. +/// The type of slots in OpenJDK. /// Currently it has the same layout as `Address`, but we override its load and store methods. /// -/// If `COMPRESSED = false`, every edge is uncompressed. +/// If `COMPRESSED = false`, every slot is uncompressed. /// /// If `COMPRESSED = true`, -/// * If this is a field of an object, the edge is compressed. +/// * If this is a field of an object, the slot is compressed. /// * If this is a root pointer: The c++ part of the binding should pass all the root pointers to /// rust as tagged pointers. /// * If the 63rd bit of the pointer is set to 1, the value referenced by the pointer is a @@ -68,18 +68,18 @@ pub fn initialize_compressed_oops_base_and_shift() { /// * Otherwise, it is a uncompressed root pointer. #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)] #[repr(transparent)] -pub struct OpenJDKEdge { +pub struct OpenJDKSlot { pub addr: Address, } -impl From
for OpenJDKEdge { +impl From
for OpenJDKSlot { fn from(value: Address) -> Self { Self { addr: value } } } -impl OpenJDKEdge { - pub const LOG_BYTES_IN_EDGE: usize = if COMPRESSED { 2 } else { 3 }; - pub const BYTES_IN_EDGE: usize = 1 << Self::LOG_BYTES_IN_EDGE; +impl OpenJDKSlot { + pub const LOG_BYTES_IN_SLOT: usize = if COMPRESSED { 2 } else { 3 }; + pub const BYTES_IN_SLOT: usize = 1 << Self::LOG_BYTES_IN_SLOT; const MASK: usize = 1usize << 63; @@ -88,7 +88,7 @@ impl OpenJDKEdge { self.addr.as_usize() & Self::MASK == 0 } - /// Get the edge address with tags stripped + /// Get the slot address with tags stripped const fn untagged_address(&self) -> Address { unsafe { Address::from_usize(self.addr.as_usize() << 1 >> 1) } } @@ -165,7 +165,7 @@ impl OpenJDKEdge { } } -impl Edge for OpenJDKEdge { +impl Slot for OpenJDKSlot { fn load(&self) -> Option { if cfg!(any(target_arch = "x86", target_arch = "x86_64")) { if COMPRESSED { @@ -203,13 +203,13 @@ impl Edge for OpenJDKEdge { } } -/// A range of OpenJDKEdge, usually used for arrays. +/// A range of OpenJDKSlot, usually used for arrays. #[derive(Clone, PartialEq, Eq, Hash, Debug)] -pub struct OpenJDKEdgeRange { - range: Range>, +pub struct OpenJDKSlotRange { + range: Range>, } -impl From> for OpenJDKEdgeRange { +impl From> for OpenJDKSlotRange { fn from(value: Range
) -> Self { Self { range: Range { @@ -220,39 +220,39 @@ impl From> for OpenJDKEdgeRange { +pub struct OpenJDKSlotRangeIterator { cursor: Address, limit: Address, } -impl Iterator for OpenJDKEdgeRangeIterator { - type Item = OpenJDKEdge; +impl Iterator for OpenJDKSlotRangeIterator { + type Item = OpenJDKSlot; fn next(&mut self) -> Option { if self.cursor >= self.limit { None } else { - let edge = self.cursor; - self.cursor += OpenJDKEdge::::BYTES_IN_EDGE; - Some(edge.into()) + let slot = self.cursor; + self.cursor += OpenJDKSlot::::BYTES_IN_SLOT; + Some(slot.into()) } } } -impl From> for Range
{ - fn from(value: OpenJDKEdgeRange) -> Self { +impl From> for Range
{ + fn from(value: OpenJDKSlotRange) -> Self { value.range.start.addr..value.range.end.addr } } -// Note that we cannot implement MemorySlice for `Range` because neither +// Note that we cannot implement MemorySlice for `Range` because neither // `MemorySlice` nor `Range` are defined in the `mmtk-openjdk` crate. ("orphan rule") -impl MemorySlice for OpenJDKEdgeRange { - type Edge = OpenJDKEdge; - type EdgeIterator = OpenJDKEdgeRangeIterator; +impl MemorySlice for OpenJDKSlotRange { + type SlotType = OpenJDKSlot; + type SlotIterator = OpenJDKSlotRangeIterator; - fn iter_edges(&self) -> Self::EdgeIterator { - OpenJDKEdgeRangeIterator { + fn iter_slots(&self) -> Self::SlotIterator { + OpenJDKSlotRangeIterator { cursor: self.range.start.addr, limit: self.range.end.addr, } diff --git a/openjdk/mmtk.h b/openjdk/mmtk.h index 1298ee51..89930abd 100644 --- a/openjdk/mmtk.h +++ b/openjdk/mmtk.h @@ -130,7 +130,7 @@ struct MutatorClosure { } }; -struct EdgesClosure { +struct SlotsClosure { NewBuffer (*func)(void** buf, size_t size, size_t capa, void* data); void* data; @@ -162,20 +162,20 @@ typedef struct { int (*referent_offset) (); int (*discovered_offset) (); char* (*dump_object_string) (void* object); - void (*scan_roots_in_all_mutator_threads)(EdgesClosure closure); - void (*scan_roots_in_mutator_thread)(EdgesClosure closure, void* tls); - void (*scan_universe_roots) (EdgesClosure closure); - void (*scan_jni_handle_roots) (EdgesClosure closure); - void (*scan_object_synchronizer_roots) (EdgesClosure closure); - void (*scan_management_roots) (EdgesClosure closure); - void (*scan_jvmti_export_roots) (EdgesClosure closure); - void (*scan_aot_loader_roots) (EdgesClosure closure); - void (*scan_system_dictionary_roots) (EdgesClosure closure); - void (*scan_code_cache_roots) (EdgesClosure closure); - void (*scan_string_table_roots) (EdgesClosure closure); - void (*scan_class_loader_data_graph_roots) (EdgesClosure closure); - void (*scan_weak_processor_roots) (EdgesClosure closure); - void (*scan_vm_thread_roots) (EdgesClosure closure); + void (*scan_roots_in_all_mutator_threads)(SlotsClosure closure); + void (*scan_roots_in_mutator_thread)(SlotsClosure closure, void* tls); + void (*scan_universe_roots) (SlotsClosure closure); + void (*scan_jni_handle_roots) (SlotsClosure closure); + void (*scan_object_synchronizer_roots) (SlotsClosure closure); + void (*scan_management_roots) (SlotsClosure closure); + void (*scan_jvmti_export_roots) (SlotsClosure closure); + void (*scan_aot_loader_roots) (SlotsClosure closure); + void (*scan_system_dictionary_roots) (SlotsClosure closure); + void (*scan_code_cache_roots) (SlotsClosure closure); + void (*scan_string_table_roots) (SlotsClosure closure); + void (*scan_class_loader_data_graph_roots) (SlotsClosure closure); + void (*scan_weak_processor_roots) (SlotsClosure closure); + void (*scan_vm_thread_roots) (SlotsClosure closure); size_t (*number_of_mutators)(); void (*schedule_finalizer)(); void (*prepare_for_roots_re_scanning)(); diff --git a/openjdk/mmtkRootsClosure.hpp b/openjdk/mmtkRootsClosure.hpp index ee92b223..d9513d81 100644 --- a/openjdk/mmtkRootsClosure.hpp +++ b/openjdk/mmtkRootsClosure.hpp @@ -8,7 +8,7 @@ #include "utilities/globalDefinitions.hpp" class MMTkRootsClosure : public OopClosure { - EdgesClosure _edges_closure; + SlotsClosure _slots_closure; void** _buffer; size_t _cap; size_t _cursor; @@ -30,7 +30,7 @@ class MMTkRootsClosure : public OopClosure { void flush() { if (_cursor > 0) { - NewBuffer buf = _edges_closure.invoke(_buffer, _cursor, _cap); + NewBuffer buf = _slots_closure.invoke(_buffer, _cursor, _cap); _buffer = buf.buf; _cap = buf.cap; _cursor = 0; @@ -38,8 +38,8 @@ class MMTkRootsClosure : public OopClosure { } public: - MMTkRootsClosure(EdgesClosure edges_closure): _edges_closure(edges_closure), _cursor(0) { - NewBuffer buf = edges_closure.invoke(NULL, 0, 0); + MMTkRootsClosure(SlotsClosure slots_closure): _slots_closure(slots_closure), _cursor(0) { + NewBuffer buf = slots_closure.invoke(NULL, 0, 0); _buffer = buf.buf; _cap = buf.cap; } diff --git a/openjdk/mmtkUpcalls.cpp b/openjdk/mmtkUpcalls.cpp index 7587d9e5..7b8d0db5 100644 --- a/openjdk/mmtkUpcalls.cpp +++ b/openjdk/mmtkUpcalls.cpp @@ -172,12 +172,12 @@ static void mmtk_get_mutators(MutatorClosure closure) { } } -static void mmtk_scan_roots_in_all_mutator_threads(EdgesClosure closure) { +static void mmtk_scan_roots_in_all_mutator_threads(SlotsClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_roots_in_all_mutator_threads(cl); } -static void mmtk_scan_roots_in_mutator_thread(EdgesClosure closure, void* tls) { +static void mmtk_scan_roots_in_mutator_thread(SlotsClosure closure, void* tls) { ResourceMark rm; JavaThread* thread = (JavaThread*) tls; MMTkRootsClosure cl(closure); @@ -257,18 +257,18 @@ static void mmtk_schedule_finalizer() { MMTkHeap::heap()->schedule_finalizer(); } -static void mmtk_scan_universe_roots(EdgesClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_universe_roots(cl); } -static void mmtk_scan_jni_handle_roots(EdgesClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_jni_handle_roots(cl); } -static void mmtk_scan_object_synchronizer_roots(EdgesClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_object_synchronizer_roots(cl); } -static void mmtk_scan_management_roots(EdgesClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_management_roots(cl); } -static void mmtk_scan_jvmti_export_roots(EdgesClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_jvmti_export_roots(cl); } -static void mmtk_scan_aot_loader_roots(EdgesClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_aot_loader_roots(cl); } -static void mmtk_scan_system_dictionary_roots(EdgesClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_system_dictionary_roots(cl); } -static void mmtk_scan_code_cache_roots(EdgesClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_code_cache_roots(cl); } -static void mmtk_scan_string_table_roots(EdgesClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_string_table_roots(cl); } -static void mmtk_scan_class_loader_data_graph_roots(EdgesClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_class_loader_data_graph_roots(cl); } -static void mmtk_scan_weak_processor_roots(EdgesClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_weak_processor_roots(cl); } -static void mmtk_scan_vm_thread_roots(EdgesClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_vm_thread_roots(cl); } +static void mmtk_scan_universe_roots(SlotsClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_universe_roots(cl); } +static void mmtk_scan_jni_handle_roots(SlotsClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_jni_handle_roots(cl); } +static void mmtk_scan_object_synchronizer_roots(SlotsClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_object_synchronizer_roots(cl); } +static void mmtk_scan_management_roots(SlotsClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_management_roots(cl); } +static void mmtk_scan_jvmti_export_roots(SlotsClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_jvmti_export_roots(cl); } +static void mmtk_scan_aot_loader_roots(SlotsClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_aot_loader_roots(cl); } +static void mmtk_scan_system_dictionary_roots(SlotsClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_system_dictionary_roots(cl); } +static void mmtk_scan_code_cache_roots(SlotsClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_code_cache_roots(cl); } +static void mmtk_scan_string_table_roots(SlotsClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_string_table_roots(cl); } +static void mmtk_scan_class_loader_data_graph_roots(SlotsClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_class_loader_data_graph_roots(cl); } +static void mmtk_scan_weak_processor_roots(SlotsClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_weak_processor_roots(cl); } +static void mmtk_scan_vm_thread_roots(SlotsClosure closure) { MMTkRootsClosure cl(closure); MMTkHeap::heap()->scan_vm_thread_roots(cl); } static size_t mmtk_number_of_mutators() { return Threads::number_of_threads();