diff --git a/src/policy/copyspace.rs b/src/policy/copyspace.rs index f4b5b950fa..4d26782b8d 100644 --- a/src/policy/copyspace.rs +++ b/src/policy/copyspace.rs @@ -181,7 +181,7 @@ impl CopySpace { // Clear VO bits because all objects in the space are dead. #[cfg(feature = "vo_bit")] - crate::util::metadata::vo_bit::bzero_vo_bit(start, size); + crate::util::metadata::side_metadata::bzero_vo_bit(start, size); } unsafe { diff --git a/src/policy/immix/block.rs b/src/policy/immix/block.rs index 7f52a1e9ee..103840df79 100644 --- a/src/policy/immix/block.rs +++ b/src/policy/immix/block.rs @@ -8,6 +8,8 @@ use crate::util::linear_scan::{Region, RegionIterator}; use crate::util::metadata::side_metadata::{MetadataByteArrayRef, SideMetadataSpec}; #[cfg(feature = "vo_bit")] use crate::util::metadata::vo_bit; +#[cfg(feature = "vo_bit")] +use crate::util::metadata::side_metadata; use crate::util::Address; use crate::vm::*; use std::sync::atomic::Ordering; @@ -280,7 +282,7 @@ impl Block { match self.get_state() { BlockState::Unmarked => { // It may contain young objects. Clear it. - vo_bit::bzero_vo_bit(self.start(), Self::BYTES); + side_metadata::bzero_vo_bit(self.start(), Self::BYTES); } BlockState::Marked => { // It contains old objects. Skip it. @@ -293,7 +295,7 @@ impl Block { for line in self.lines() { if !line.is_marked(state) { // It may contain young objects. Clear it. - vo_bit::bzero_vo_bit(line.start(), Line::BYTES); + side_metadata::bzero_vo_bit(line.start(), Line::BYTES); } } } diff --git a/src/policy/immix/immixspace.rs b/src/policy/immix/immixspace.rs index 3e94ee9c55..47e315f76a 100644 --- a/src/policy/immix/immixspace.rs +++ b/src/policy/immix/immixspace.rs @@ -17,6 +17,8 @@ use crate::util::linear_scan::{Region, RegionIterator}; use crate::util::metadata::side_metadata::SideMetadataSpec; #[cfg(feature = "vo_bit")] use crate::util::metadata::vo_bit; +#[cfg(feature = "vo_bit")] +use crate::util::metadata::side_metadata; use crate::util::metadata::{self, MetadataSpec}; use crate::util::object_forwarding; use crate::util::{Address, ObjectReference}; @@ -1096,7 +1098,7 @@ impl GCWork for ClearVOBitsAfterPrepare { fn do_work(&mut self, _worker: &mut GCWorker, _mmtk: &'static MMTK) { match self.scope { VOBitsClearingScope::FullGC => { - vo_bit::bzero_vo_bit(self.chunk.start(), Chunk::BYTES); + side_metadata::bzero_vo_bit(self.chunk.start(), Chunk::BYTES); } VOBitsClearingScope::BlockOnly => { self.clear_blocks(None); diff --git a/src/policy/marksweepspace/native_ms/block.rs b/src/policy/marksweepspace/native_ms/block.rs index 6727430e9e..be838c7e33 100644 --- a/src/policy/marksweepspace/native_ms/block.rs +++ b/src/policy/marksweepspace/native_ms/block.rs @@ -361,7 +361,7 @@ impl Block { // Clear VO bit: we don't know where the object reference actually is, so we bulk zero the cell. #[cfg(feature = "vo_bit")] - crate::util::metadata::vo_bit::bzero_vo_bit(cell, cell_size); + crate::util::metadata::side_metadata::bzero_vo_bit(cell, cell_size); // store the previous cell to make the free list debug_assert!(last.is_zero() || (last >= self.start() && last < self.end())); diff --git a/src/policy/marksweepspace/native_ms/global.rs b/src/policy/marksweepspace/native_ms/global.rs index 06540eb3f3..e2441541e4 100644 --- a/src/policy/marksweepspace/native_ms/global.rs +++ b/src/policy/marksweepspace/native_ms/global.rs @@ -379,7 +379,7 @@ impl MarkSweepSpace { metadata_spec.set_zero_atomic(block.start(), Ordering::SeqCst); } #[cfg(feature = "vo_bit")] - crate::util::metadata::vo_bit::bzero_vo_bit(block.start(), Block::BYTES); + crate::util::metadata::side_metadata::bzero_vo_bit(block.start(), Block::BYTES); } pub fn acquire_block(&self, tls: VMThread, size: usize, align: usize) -> BlockAcquireResult { diff --git a/src/util/metadata/side_metadata/global.rs b/src/util/metadata/side_metadata/global.rs index cc1a738640..48d3a4d391 100644 --- a/src/util/metadata/side_metadata/global.rs +++ b/src/util/metadata/side_metadata/global.rs @@ -12,6 +12,18 @@ use std::fmt; use std::io::Result; use std::sync::atomic::{AtomicU8, Ordering}; +#[cfg(feature = "vo_bit")] +/// Bulk zero the VO bit. +pub fn bzero_vo_bit(start: Address, size: usize) { + VO_BIT_SIDE_METADATA_SPEC.bzero_metadata(start, size); +} +#[cfg(feature = "vo_bit")] +/// Bulk set the VO bit. +pub fn bset_vo_bit(start: Address, size: usize) { + VO_BIT_SIDE_METADATA_SPEC.bset_metadata(start, size); +} + + /// This struct stores the specification of a side metadata bit-set. /// It is used as an input to the (inline) functions provided by the side metadata module. /// diff --git a/src/util/metadata/vo_bit/helper.rs b/src/util/metadata/vo_bit/helper.rs index c9c992693d..3ccf41e7e1 100644 --- a/src/util/metadata/vo_bit/helper.rs +++ b/src/util/metadata/vo_bit/helper.rs @@ -195,7 +195,7 @@ pub(crate) fn on_region_swept(region: &R, is_occupied: vo_bit::bcopy_vo_bit_from_mark_bit::(region.start(), R::BYTES); } else { // If the block has no live objects, simply clear the VO bits. - vo_bit::bzero_vo_bit(region.start(), R::BYTES); + crate::util::metadata::side_metadata::bzero_vo_bit(region.start(), R::BYTES); } } } diff --git a/src/util/metadata/vo_bit/mod.rs b/src/util/metadata/vo_bit/mod.rs index a64c8f7908..d6950757c0 100644 --- a/src/util/metadata/vo_bit/mod.rs +++ b/src/util/metadata/vo_bit/mod.rs @@ -140,11 +140,6 @@ pub unsafe fn is_vo_bit_set_unsafe(address: Address) -> Option