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

source

const EMPTY_SFT_INDEX: u8 = 0u8

Empty space is at index 0

source

pub fn new() -> Self

source

pub fn addr_to_index(addr: Address) -> u8

Trait Implementations§

source§

impl SFTMap for SFTDenseChunkMap

source§

fn has_sft_entry(&self, addr: Address) -> bool

Check if the address has an SFT entry in the map (including an empty SFT entry). This is mostly a bound check to make sure that we won’t have an index-out-of-bound error. For the sake of performance, the implementation of other methods in this trait (such as get_unchecked(), update() and clear()) does not need to do this check implicitly. Instead, they assume the address has a valid entry in the SFT. If an address could be arbitary, they should call this method as a pre-check before they call those methods in the trait. We also provide a method 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>

Get the side metadata spec this SFT map uses.
source§

fn get_checked(&self, address: Address) -> &dyn SFT

Get SFT for the address. The address can be arbitrary. For out-of-bound access, an empty SFT will be returned. We only provide the checked version for 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

Get SFT for the address. The address must have a valid SFT entry in the table (e.g. from an object reference, or from an address that is known to be in our spaces). Otherwise, use get_checked(). Read more
source§

fn notify_space_creation(&mut self, space: *const dyn SFT + Sync + 'static)

Notify the SFT map for space creation. 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 )

Eagerly initialize the SFT table. For most implementations, it could be the same as update(). However, we need this as a seprate method for SFTDenseChunkMap, as it needs to map side metadata first before setting the table. Read more
source§

unsafe fn update( &self, space: *const dyn SFT + Sync + 'static, start: Address, bytes: usize )

Set SFT for the address range. The address must have a valid SFT entry in the table. Read more
source§

unsafe fn clear(&self, address: Address)

Clear SFT for the address. The address must have a valid SFT entry in the table. Read more
source§

impl Sync for SFTDenseChunkMap

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert 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>

Convert 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)

Convert &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)

Convert &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
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.