Struct mmtk::policy::sft_map::dense_chunk_map::SFTDenseChunkMap
source · pub struct SFTDenseChunkMap {
sft: Vec<SFTRefStorage>,
index_map: HashMap<String, usize>,
}
Expand description
SFTDenseChunkMap is a small table. It has one entry for each space in the table, and use side metadata to record the index for each chunk. This works for both 32 bits and 64 bits. However, its performance is expected to be suboptimal, compared to the sparse chunk map on 32 bits, and the space map on 64 bits. So usually we do not use this implementation. However, it provides some flexibility so we can set SFT at chunk basis for 64bits for decent performance. For example, when we use library malloc for mark sweep, we have no control of where the library malloc may allocate into, so we cannot use the space map. And using a sparse chunk map will be costly in terms of memory. In this case, the dense chunk map is a good solution.
Fields§
§sft: Vec<SFTRefStorage>
The dense table, one entry per space. We use side metadata to store the space index for each chunk. 0 is EMPTY_SPACE_SFT.
index_map: HashMap<String, usize>
A map from space name (assuming they are unique) to their index. We use this to know whether we have pushed &dyn SFT for a space, and to know its index.
Implementations§
source§impl SFTDenseChunkMap
impl SFTDenseChunkMap
sourceconst EMPTY_SFT_INDEX: u8 = 0u8
const EMPTY_SFT_INDEX: u8 = 0u8
Empty space is at index 0
pub fn new() -> Self
pub fn addr_to_index(addr: Address) -> u8
Trait Implementations§
source§impl SFTMap for SFTDenseChunkMap
impl SFTMap for SFTDenseChunkMap
source§fn has_sft_entry(&self, addr: Address) -> bool
fn has_sft_entry(&self, addr: Address) -> bool
get_checked()
which includes
this check, and will return an empty SFT if the address is out of bound.source§fn get_side_metadata(&self) -> Option<&SideMetadataSpec>
fn get_side_metadata(&self) -> Option<&SideMetadataSpec>
source§fn get_checked(&self, address: Address) -> &dyn SFT
fn get_checked(&self, address: Address) -> &dyn SFT
get()
, as it may be used to query arbitrary objects and addresses. Other methods like update/clear/etc
are
mostly used inside MMTk, and in most cases, we know that they are within our space address range.source§unsafe fn get_unchecked(&self, address: Address) -> &dyn SFT
unsafe fn get_unchecked(&self, address: Address) -> &dyn SFT
get_checked()
. Read moresource§fn notify_space_creation(&mut self, space: *const dyn SFT + Sync + 'static)
fn notify_space_creation(&mut self, space: *const dyn SFT + Sync + 'static)
DenseChunkMap
needs to create an entry for the space.source§unsafe fn eager_initialize(
&mut self,
space: *const dyn SFT + Sync + 'static,
start: Address,
bytes: usize
)
unsafe fn eager_initialize( &mut self, space: *const dyn SFT + Sync + 'static, start: Address, bytes: usize )
impl Sync for SFTDenseChunkMap
Auto Trait Implementations§
impl RefUnwindSafe for SFTDenseChunkMap
impl Send for SFTDenseChunkMap
impl Unpin for SFTDenseChunkMap
impl UnwindSafe for SFTDenseChunkMap
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more