diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a9587bc..0dc0340 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,7 +12,7 @@ concurrency: jobs: style-check: name: Style check - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 strategy: fail-fast: true steps: @@ -29,7 +29,7 @@ jobs: build-and-test: name: Build and test - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 strategy: fail-fast: true matrix: diff --git a/mmtk/Cargo.lock b/mmtk/Cargo.lock index db38f00..3c42ff2 100644 --- a/mmtk/Cargo.lock +++ b/mmtk/Cargo.lock @@ -52,12 +52,12 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.7" +version = "3.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa" dependencies = [ "anstyle", - "once_cell", + "once_cell_polyfill", "windows-sys", ] @@ -94,9 +94,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "bitflags" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" [[package]] name = "built" @@ -109,9 +109,9 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.22.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" +checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" dependencies = [ "bytemuck_derive", ] @@ -124,14 +124,14 @@ checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] name = "cc" -version = "1.2.19" +version = "1.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" +checksum = "16595d3be041c03b09d08d0858631facccee9221e579704070e6e9e4915d3bc7" dependencies = [ "jobserver", "libc", @@ -220,7 +220,7 @@ checksum = "b9b6483c2bbed26f97861cf57651d4f2b731964a28cd2257f934a4b452480d21" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -252,7 +252,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -289,9 +289,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "libc", @@ -301,9 +301,9 @@ dependencies = [ [[package]] name = "git2" -version = "0.20.1" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5220b8ba44c68a9a7f7a7659e864dd73692e417ef0211bea133c7b74e031eeb9" +checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110" dependencies = [ "bitflags", "libc", @@ -326,9 +326,9 @@ checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hermit-abi" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e" +checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" [[package]] name = "idna" @@ -354,9 +354,9 @@ dependencies = [ [[package]] name = "idna_mapping" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5422cc5bc64289a77dbb45e970b86b5e9a04cb500abc7240505aedc1bf40f38" +checksum = "11c13906586a4b339310541a274dd927aff6fcbb5b8e3af90634c4b31681c792" dependencies = [ "unicode-joining-type", ] @@ -367,7 +367,7 @@ version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ - "hermit-abi 0.5.0", + "hermit-abi 0.5.1", "libc", "windows-sys", ] @@ -389,9 +389,9 @@ dependencies = [ [[package]] name = "jiff" -version = "0.2.8" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ad87c89110f55e4cd4dc2893a9790820206729eaf221555f742d540b0724a0" +checksum = "a194df1107f33c79f4f93d02c80798520551949d59dfad22b6157048a88cca93" dependencies = [ "jiff-static", "log", @@ -402,13 +402,13 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.8" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d076d5b64a7e2fe6f0743f02c43ca4a6725c0f904203bfe276a5b3e793103605" +checksum = "6c6e1db7ed32c6c71b759497fae34bf7933636f75a251b9e736555da426f6442" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -429,9 +429,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.171" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libgit2-sys" @@ -490,8 +490,8 @@ dependencies = [ [[package]] name = "mmtk" -version = "0.30.0" -source = "git+https://github.com/mmtk/mmtk-core.git?rev=973bd02762ca6846ec26317786ab2b9bafe9a008#973bd02762ca6846ec26317786ab2b9bafe9a008" +version = "0.31.0" +source = "git+https://github.com/mmtk/mmtk-core.git?rev=d538987ecb3270d89343382dc5464c263adae3e5#d538987ecb3270d89343382dc5464c263adae3e5" dependencies = [ "atomic", "atomic-traits", @@ -528,13 +528,13 @@ dependencies = [ [[package]] name = "mmtk-macros" -version = "0.30.0" -source = "git+https://github.com/mmtk/mmtk-core.git?rev=973bd02762ca6846ec26317786ab2b9bafe9a008#973bd02762ca6846ec26317786ab2b9bafe9a008" +version = "0.31.0" +source = "git+https://github.com/mmtk/mmtk-core.git?rev=d538987ecb3270d89343382dc5464c263adae3e5#d538987ecb3270d89343382dc5464c263adae3e5" dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -585,6 +585,12 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + [[package]] name = "percent-encoding" version = "2.3.1" @@ -644,9 +650,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -726,9 +732,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" [[package]] name = "scopeguard" @@ -759,7 +765,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -805,7 +811,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -820,9 +826,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.100" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", "quote", @@ -872,9 +878,9 @@ checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-joining-type" -version = "0.7.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22f8cb47ccb8bc750808755af3071da4a10dcd147b68fc874b7ae4b12543f6f5" +checksum = "d8d00a78170970967fdb83f9d49b92f959ab2bb829186b113e4f4604ad98e180" [[package]] name = "unicode-normalization" @@ -981,7 +987,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -992,7 +998,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index 4969156..2bc2b10 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -12,7 +12,7 @@ edition = "2021" # Metadata for the Ruby repository [package.metadata.ci-repos.ruby] repo = "mmtk/ruby" # This is used by actions/checkout, so the format is "owner/repo", not URL. -rev = "0879d0db03f1f09f43132647b815013f8482a9f0" +rev = "820a028762342fb44b34954a49fa2faec8563198" [lib] name = "mmtk_ruby" @@ -37,7 +37,7 @@ features = ["is_mmtk_object", "object_pinning", "sticky_immix_non_moving_nursery # Uncomment the following lines to use mmtk-core from the official repository. git = "https://github.com/mmtk/mmtk-core.git" -rev = "973bd02762ca6846ec26317786ab2b9bafe9a008" +rev = "d538987ecb3270d89343382dc5464c263adae3e5" # Uncomment the following line to use mmtk-core from a local repository. #path = "../../mmtk-core" diff --git a/mmtk/cbindgen.toml b/mmtk/cbindgen.toml index 94f01a0..eb92dd6 100644 --- a/mmtk/cbindgen.toml +++ b/mmtk/cbindgen.toml @@ -46,5 +46,4 @@ include = ["HiddenHeader"] "OBJREF_OFFSET" = "MMTK_OBJREF_OFFSET" "MIN_OBJ_ALIGN" = "MMTK_MIN_OBJ_ALIGN" "HiddenHeader" = "MMTk_HiddenHeader" -"HAS_MOVED_GIVTBL" = "MMTK_HAS_MOVED_GIVTBL" "HIDDEN_SIZE_MASK" = "MMTK_HIDDEN_SIZE_MASK" diff --git a/mmtk/src/abi.rs b/mmtk/src/abi.rs index f2ce5b7..7a1e8e8 100644 --- a/mmtk/src/abi.rs +++ b/mmtk/src/abi.rs @@ -110,22 +110,22 @@ impl RubyObjectAccess { Self::prefix_size() + self.payload_size() + Self::suffix_size() } - pub fn get_givtbl(&self) -> *mut libc::c_void { - self.get_original_givtbl() + pub fn get_gen_fields_tbl(&self) -> *mut libc::c_void { + self.get_original_gen_fields_tbl() .or_else(|| { - let moved_givtbl = crate::binding().moved_givtbl.lock().unwrap(); - moved_givtbl.get(&self.objref).map(|entry| entry.gen_ivtbl) + let moved_gen_fields_tables = crate::binding().moved_gen_fields_tables.lock().unwrap(); + moved_gen_fields_tables.get(&self.objref).map(|entry| entry.gen_fields_tbl) }) .unwrap_or_else(|| { panic!( - "The givtbl of object {} is not found in generic_iv_tbl_ or binding().moved_givtbl", + "The gen_fields_tbl of object {} is not found in generic_fields_tbl_ or binding().moved_gen_fields_tables", self.objref ) }) } - pub fn get_original_givtbl(&self) -> Option<*mut libc::c_void> { - let addr = (upcalls().get_original_givtbl)(self.objref); + pub fn get_original_gen_fields_tbl(&self) -> Option<*mut libc::c_void> { + let addr = (upcalls().get_original_gen_fields_tbl)(self.objref); if addr.is_null() { None } else { @@ -351,7 +351,6 @@ pub struct RubyUpcalls { pub scan_yjit_roots: extern "C" fn(), pub scan_global_symbols_roots: extern "C" fn(), pub scan_finalizer_tbl_roots: extern "C" fn(), - pub scan_obj_to_id_tbl_roots: extern "C" fn(), pub scan_misc_roots: extern "C" fn(), pub scan_final_jobs_roots: extern "C" fn(), pub scan_roots_in_mutator_thread: @@ -360,20 +359,20 @@ pub struct RubyUpcalls { 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), - pub cleanup_generic_iv_tbl: extern "C" fn(), - pub get_original_givtbl: extern "C" fn(object: ObjectReference) -> *mut libc::c_void, - pub move_givtbl: extern "C" fn(old_objref: ObjectReference, new_objref: ObjectReference), + pub cleanup_generic_fields_tbl: extern "C" fn(), + pub get_original_gen_fields_tbl: extern "C" fn(object: ObjectReference) -> *mut libc::c_void, + pub reinsert_generic_fields_tbl_entry: + extern "C" fn(old_objref: ObjectReference, new_objref: ObjectReference), pub vm_live_bytes: extern "C" fn() -> usize, pub update_frozen_strings_table: extern "C" fn(), pub update_finalizer_and_obj_id_tables: extern "C" fn(), pub update_global_symbols_table: extern "C" fn(), pub update_overloaded_cme_table: extern "C" fn(), pub update_ci_table: extern "C" fn(), - pub get_generic_iv_tbl: extern "C" fn() -> *mut st_table, - pub get_frozen_strings_table: extern "C" fn() -> *mut st_table, + pub get_generic_fields_tbl: extern "C" fn() -> *mut st_table, + pub get_num_fstrings: extern "C" fn() -> usize, pub get_finalizer_table: extern "C" fn() -> *mut st_table, - pub get_obj_to_id_table: extern "C" fn() -> *mut st_table, - pub get_id_to_obj_table: extern "C" fn() -> *mut st_table, + pub get_id2ref_table: extern "C" fn() -> *mut st_table, pub get_global_symbols_table: extern "C" fn() -> *mut st_table, pub get_overloaded_cme_table: extern "C" fn() -> *mut st_table, pub get_ci_table: extern "C" fn() -> *mut st_table, diff --git a/mmtk/src/api.rs b/mmtk/src/api.rs index e45ab82..ce5f254 100644 --- a/mmtk/src/api.rs +++ b/mmtk/src/api.rs @@ -313,9 +313,9 @@ pub extern "C" fn mmtk_register_ppps(objects: *const ObjectReference, len: usize } #[no_mangle] -pub extern "C" fn mmtk_get_givtbl_during_gc(object: ObjectReference) -> *mut libc::c_void { +pub extern "C" fn mmtk_get_gen_fields_tbl_during_gc(object: ObjectReference) -> *mut libc::c_void { let acc = RubyObjectAccess::from_objref(object); - acc.get_givtbl() + acc.get_gen_fields_tbl() } #[no_mangle] diff --git a/mmtk/src/binding.rs b/mmtk/src/binding.rs index 56ee3ed..cde3733 100644 --- a/mmtk/src/binding.rs +++ b/mmtk/src/binding.rs @@ -49,9 +49,9 @@ impl RubyBindingFastMut { } } -pub(crate) struct MovedGIVTblEntry { +pub(crate) struct MovedGenFieldsTablesEntry { pub old_objref: ObjectReference, - pub gen_ivtbl: *mut c_void, + pub gen_fields_tbl: *mut c_void, } pub struct RubyBinding { @@ -61,7 +61,7 @@ pub struct RubyBinding { pub plan_name: Mutex>, pub weak_proc: WeakProcessor, pub ppp_registry: PPPRegistry, - pub(crate) moved_givtbl: Mutex>, + pub(crate) moved_gen_fields_tables: Mutex>, pub gc_thread_join_handles: Mutex>>, pub wb_unprotected_objects: Mutex>, pub st_entries_chunk_size: usize, @@ -104,7 +104,7 @@ impl RubyBinding { plan_name: Mutex::new(None), weak_proc: WeakProcessor::new(), ppp_registry: PPPRegistry::new(), - moved_givtbl: Default::default(), + moved_gen_fields_tables: Default::default(), gc_thread_join_handles: Default::default(), wb_unprotected_objects: Default::default(), st_entries_chunk_size, diff --git a/mmtk/src/object_model.rs b/mmtk/src/object_model.rs index 9311926..5fb7cef 100644 --- a/mmtk/src/object_model.rs +++ b/mmtk/src/object_model.rs @@ -43,10 +43,10 @@ impl ObjectModel for VMObjectModel { copy_context: &mut GCWorkerCopyContext, ) -> ObjectReference { let from_acc = RubyObjectAccess::from_objref(from); - let maybe_givtbl = from_acc.has_exivar_flag().then(|| { + let maybe_gen_fields_tbl = from_acc.has_exivar_flag().then(|| { from_acc - .get_original_givtbl() - .unwrap_or_else(|| panic!("Object {} has FL_EXIVAR but no givtbl.", from)) + .get_original_gen_fields_tbl() + .unwrap_or_else(|| panic!("Object {} has FL_EXIVAR but no gen_fields_tbl.", from)) }); let from_start = from_acc.obj_start(); let object_size = from_acc.object_size(); @@ -74,17 +74,16 @@ impl ObjectModel for VMObjectModel { unsafe { std::ptr::write_bytes::(from_start.to_mut_ptr(), 0, object_size) } } - if let Some(givtbl) = maybe_givtbl { - { - let mut moved_givtbl = crate::binding().moved_givtbl.lock().unwrap(); - moved_givtbl.insert( - to_obj, - crate::binding::MovedGIVTblEntry { - old_objref: from, - gen_ivtbl: givtbl, - }, - ); - } + if let Some(gen_fields_tbl) = maybe_gen_fields_tbl { + let mut moved_gen_fields_tables = + crate::binding().moved_gen_fields_tables.lock().unwrap(); + moved_gen_fields_tables.insert( + to_obj, + crate::binding::MovedGenFieldsTablesEntry { + old_objref: from, + gen_fields_tbl, + }, + ); } to_obj diff --git a/mmtk/src/scanning.rs b/mmtk/src/scanning.rs index 4f27189..0848cec 100644 --- a/mmtk/src/scanning.rs +++ b/mmtk/src/scanning.rs @@ -89,7 +89,6 @@ impl Scanning for VMScanning { Box::new(ScanYjitRoots::new(factory.clone())), Box::new(ScanGlobalSymbolsRoots::new(factory.clone())), Box::new(ScanFinalizerTblRoots::new(factory.clone())), - Box::new(ScanObjToIdTblRoots::new(factory.clone())), Box::new(ScanMiscRoots::new(factory.clone())), Box::new(ScanFinalJobsRoots::new(factory.clone())), ]; @@ -268,10 +267,6 @@ define_global_root_scanner!(ScanFinalizerTblRoots, { (crate::upcalls().scan_finalizer_tbl_roots)(); }); -define_global_root_scanner!(ScanObjToIdTblRoots, { - (crate::upcalls().scan_obj_to_id_tbl_roots)(); -}); - define_global_root_scanner!(ScanMiscRoots, { (crate::upcalls().scan_misc_roots)(); }); diff --git a/mmtk/src/weak_proc.rs b/mmtk/src/weak_proc.rs index 21efb23..9e12299 100644 --- a/mmtk/src/weak_proc.rs +++ b/mmtk/src/weak_proc.rs @@ -8,7 +8,7 @@ use mmtk::{ use crate::{ abi::{st_table, GCThreadTLS}, - binding::MovedGIVTblEntry, + binding::MovedGenFieldsTablesEntry, extra_assert, is_mmtk_object_safe, upcalls, utils::AfterAll, Ruby, @@ -65,8 +65,8 @@ impl WeakProcessor { worker.add_work(WorkBucketStage::VMRefClosure, ProcessObjFreeCandidates); worker.scheduler().work_buckets[WorkBucketStage::VMRefClosure].bulk_add(vec![ - Box::new(UpdateGenericIvTbl) as _, - // Box::new(UpdateFrozenStringsTable) as _, + Box::new(UpdateGenericFieldsTbl) as _, + Box::new(UpdateFrozenStringsTable) as _, Box::new(UpdateFinalizerAndObjIdTables) as _, // Box::new(UpdateGlobalSymbolsTable) as _, Box::new(UpdateOverloadedCmeTable) as _, @@ -76,16 +76,6 @@ impl WeakProcessor { let forward = crate::mmtk().get_plan().current_gc_may_move_object(); - // Experimenting with frozen strings table - Self::process_weak_table_chunked( - "frozen strings", - (upcalls().get_frozen_strings_table)(), - true, - false, - forward, - worker, - ); - Self::process_weak_table_chunked( "global symbols", (upcalls().get_global_symbols_table)(), @@ -170,37 +160,43 @@ impl WeakProcessor { /// Update generic instance variable tables. /// - /// Objects moved during GC should have their entries in the global `generic_iv_tbl_` hash + /// Objects moved during GC should have their entries in the global `generic_fields_tbl_` hash /// table updated, and dead objects should have their entries removed. - fn update_generic_iv_tbl() { - // Update `generic_iv_tbl_` entries for moved objects. We could update the entries in + fn update_generic_fields_tbl() { + // Update `generic_fields_tbl_` entries for moved objects. We could update the entries in // `ObjectModel::move`. However, because `st_table` is not thread-safe, we postpone the // update until now in the VMRefClosure stage. - log::debug!("Updating global ivtbl entries..."); + log::debug!("Updating generic_fields_tbl_ entries..."); let items_moved = { - let mut moved_givtbl = crate::binding() - .moved_givtbl + let mut moved_gen_fields_tables = crate::binding() + .moved_gen_fields_tables .try_lock() .expect("Should have no race in weak_proc"); - let items_moved = moved_givtbl.len(); - for (new_objref, MovedGIVTblEntry { old_objref, .. }) in moved_givtbl.drain() { - trace!(" givtbl {} -> {}", old_objref, new_objref); - (upcalls().move_givtbl)(old_objref, new_objref); + let items_moved = moved_gen_fields_tables.len(); + for (new_objref, MovedGenFieldsTablesEntry { old_objref, .. }) in + moved_gen_fields_tables.drain() + { + trace!( + " generic_fields_tbl_ entry: {} -> {}", + old_objref, + new_objref + ); + (upcalls().reinsert_generic_fields_tbl_entry)(old_objref, new_objref); } items_moved }; - log::debug!("Updated global ivtbl entries. {items_moved} items moved."); + log::debug!("Updated generic_fields_tbl_ entries. {items_moved} items moved."); // Clean up entries for dead objects. - let generic_iv_tbl = (upcalls().get_generic_iv_tbl)(); - let old_size = (upcalls().st_get_num_entries)(generic_iv_tbl); - log::debug!("Cleaning up global ivtbl entries ({old_size} entries before)..."); - (crate::upcalls().cleanup_generic_iv_tbl)(); - let new_size = (upcalls().st_get_num_entries)(generic_iv_tbl); - log::debug!("Cleaning up global ivtbl entries ({new_size} entries after)."); + let generic_fields_tbl = (upcalls().get_generic_fields_tbl)(); + let old_size = (upcalls().st_get_num_entries)(generic_fields_tbl); + log::debug!("Cleaning up generic_fields_tbl_ entries ({old_size} entries before)..."); + (crate::upcalls().cleanup_generic_fields_tbl)(); + let new_size = (upcalls().st_get_num_entries)(generic_fields_tbl); + log::debug!("Cleaned up generic_fields_tbl_ entries ({new_size} entries after)."); probe!( mmtk_ruby, - update_generic_iv_tbl, + update_generic_fields_tbl, items_moved, old_size, new_size @@ -289,8 +285,15 @@ macro_rules! define_global_table_processor { }; } -define_global_table_processor!(UpdateGenericIvTbl, { - WeakProcessor::update_generic_iv_tbl(); +define_global_table_processor!(UpdateGenericFieldsTbl, { + WeakProcessor::update_generic_fields_tbl(); +}); + +define_global_table_processor!(UpdateFrozenStringsTable, { + let old_size = (upcalls().get_num_fstrings)(); + (upcalls().update_frozen_strings_table)(); + let new_size = (upcalls().get_num_fstrings)(); + probe!(mmtk_ruby, weak_table_size_change, old_size, new_size); }); fn general_update_weak_table(getter: extern "C" fn() -> *mut st_table, cleaner: extern "C" fn()) { @@ -304,13 +307,6 @@ fn general_update_weak_table(getter: extern "C" fn() -> *mut st_table, cleaner: #[allow(dead_code)] mod unused { use super::*; - define_global_table_processor!(UpdateFrozenStringsTable, { - general_update_weak_table( - upcalls().get_frozen_strings_table, - upcalls().update_frozen_strings_table, - ); - }); - define_global_table_processor!(UpdateGlobalSymbolsTable, { general_update_weak_table( upcalls().get_global_symbols_table, @@ -319,28 +315,31 @@ mod unused { }); } +fn st_get_num_entries_maybe_null(table: *const st_table) -> usize { + if table.is_null() { + 0 + } else { + (upcalls().st_get_num_entries)(table) + } +} + define_global_table_processor!(UpdateFinalizerAndObjIdTables, { let finalizer_table = (upcalls().get_finalizer_table)(); - let obj_to_id_table = (upcalls().get_obj_to_id_table)(); - let id_to_obj_table = (upcalls().get_id_to_obj_table)(); + let id2ref_table = (upcalls().get_id2ref_table)(); let old_size_finalizer = (upcalls().st_get_num_entries)(finalizer_table); - let old_size_obj_to_id = (upcalls().st_get_num_entries)(obj_to_id_table); - let old_size_id_to_obj = (upcalls().st_get_num_entries)(id_to_obj_table); + let old_size_id_to_obj = st_get_num_entries_maybe_null(id2ref_table); (upcalls().update_finalizer_and_obj_id_tables)(); let new_size_finalizer = (upcalls().st_get_num_entries)(finalizer_table); - let new_size_obj_to_id = (upcalls().st_get_num_entries)(obj_to_id_table); - let new_size_id_to_obj = (upcalls().st_get_num_entries)(id_to_obj_table); + let new_size_id_to_obj = st_get_num_entries_maybe_null(id2ref_table); probe!( mmtk_ruby, update_finalizer_and_obj_id_tables, old_size_finalizer, new_size_finalizer, - old_size_obj_to_id, - new_size_obj_to_id, old_size_id_to_obj, new_size_id_to_obj, ); diff --git a/tools/tracing/timeline/capture_ruby.bt b/tools/tracing/timeline/capture_ruby.bt index 37b1ef9..6959e8b 100644 --- a/tools/tracing/timeline/capture_ruby.bt +++ b/tools/tracing/timeline/capture_ruby.bt @@ -24,7 +24,7 @@ usdt:$MMTK:mmtk_ruby:weak_table_size_change { usdt:$MMTK:mmtk_ruby:update_finalizer_and_obj_id_tables { if (@enable_print) { - printf("update_finalizer_and_obj_id_tables,meta,%d,%lu,%lu,%lu,%lu,%lu,%lu,%lu\n", tid, nsecs, arg0, arg1, arg2, arg3, arg4, arg5); + printf("update_finalizer_and_obj_id_tables,meta,%d,%lu,%lu,%lu,%lu,%lu\n", tid, nsecs, arg0, arg1, arg2, arg3); } } @@ -52,9 +52,9 @@ usdt:$MMTK:mmtk_ruby:update_table_bins_parallel { } } -usdt:$MMTK:mmtk_ruby:update_generic_iv_tbl { +usdt:$MMTK:mmtk_ruby:update_generic_fields_tbl { if (@enable_print) { - printf("update_generic_iv_tbl,meta,%d,%lu,%lu,%lu,%lu\n", tid, nsecs, arg0, arg1, arg2); + printf("update_generic_fields_tbl,meta,%d,%lu,%lu,%lu,%lu\n", tid, nsecs, arg0, arg1, arg2); } } diff --git a/tools/tracing/timeline/visualize_ruby.py b/tools/tracing/timeline/visualize_ruby.py index 13110b6..2b410ee 100755 --- a/tools/tracing/timeline/visualize_ruby.py +++ b/tools/tracing/timeline/visualize_ruby.py @@ -46,12 +46,10 @@ def enrich_meta_extra(log_processor, name, tid, ts, gc, wp, args): case "update_finalizer_and_obj_id_tables": (finalizer_before, finalizer_after, - obj_to_id_before, obj_to_id_after, - id_to_obj_before, id_to_obj_after) = [int(x) for x in args] + id2ref_before, id2ref_after) = [int(x) for x in args] wp["args"] |= { "finalizer": { "before": finalizer_before, "after": finalizer_after, "diff": finalizer_after - finalizer_before }, - "obj_to_id": { "before": obj_to_id_before, "after": obj_to_id_after, "diff": obj_to_id_after - obj_to_id_before }, - "id_to_obj": { "before": id_to_obj_before, "after": id_to_obj_after, "diff": id_to_obj_after - id_to_obj_before }, + "id2ref": { "before": id2ref_before, "after": id2ref_after, "diff": id2ref_after - id2ref_before }, } case "initial_weak_table_stats": @@ -105,7 +103,7 @@ def enrich_meta_extra(log_processor, name, tid, ts, gc, wp, args): "table_name": table_name, } - case "update_generic_iv_tbl": + case "update_generic_fields_tbl": entries_moved, old_entries, new_entries = [int(x) for x in args[0:3]] wp["args"] |= { "entries_moved": entries_moved,