pub struct TwoLevelStateStorage {
slabs: Vec<OnceOptionBox<[Atomic<MapState>; 8192]>>,
}Expand description
A two-level implementation of MapStateStorage.
It is essentially a lazily initialized array of [Atomic<MapState>]. Because it is designed to
govern a large address range, and the array is sparse, we use a two-level design. The higher
level holds a vector of slabs, and each slab holds an array of [Atomic<MapState>]. Each slab
governs an aligned region of MMAP_CHUNKS_PER_SLAB chunks. Slabs are lazily created when the
user intends to write into one of its MapState.
Fields§
§slabs: Vec<OnceOptionBox<[Atomic<MapState>; 8192]>>Slabs
Implementations§
source§impl TwoLevelStateStorage
impl TwoLevelStateStorage
pub fn new() -> Self
fn new_slab() -> [Atomic<MapState>; 8192]
fn slab_table(&self, addr: Address) -> Option<&[Atomic<MapState>; 8192]>
fn get_or_allocate_slab_table(&self, addr: Address) -> &[Atomic<MapState>; 8192]
fn slab_index(addr: Address) -> usize
fn in_slab_index(addr: Address) -> usize
sourcefn foreach_slab_slice_for_write<'s, F>(&'s self, range: ChunkRange, f: F)
fn foreach_slab_slice_for_write<'s, F>(&'s self, range: ChunkRange, f: F)
Visit all slabs that overlap with the range from low to high address. For each slab, call
f with the slice of the slab that overlap with the chunks within the range.
Trait Implementations§
source§impl Debug for TwoLevelStateStorage
impl Debug for TwoLevelStateStorage
source§impl Default for TwoLevelStateStorage
impl Default for TwoLevelStateStorage
source§impl MapStateStorage for TwoLevelStateStorage
impl MapStateStorage for TwoLevelStateStorage
source§fn log_mappable_bytes(&self) -> u8
fn log_mappable_bytes(&self) -> u8
The logarithm of the address space size this
MapStateStorage can handle.source§fn get_state(&self, chunk: Address) -> MapState
fn get_state(&self, chunk: Address) -> MapState
Return the state of a given
chunk (must be aligned). Read moresource§fn bulk_set_state(&self, range: ChunkRange, state: MapState)
fn bulk_set_state(&self, range: ChunkRange, state: MapState)
Set all chunks within
range to state.source§fn bulk_transition_state<F>(
&self,
range: ChunkRange,
update_fn: F,
) -> Result<()>
fn bulk_transition_state<F>( &self, range: ChunkRange, update_fn: F, ) -> Result<()>
Visit the chunk states within
range and allow the update_fn callback to inspect and
change the states. Read moreimpl Send for TwoLevelStateStorage
impl Sync for TwoLevelStateStorage
Auto Trait Implementations§
impl Freeze for TwoLevelStateStorage
impl RefUnwindSafe for TwoLevelStateStorage
impl Unpin for TwoLevelStateStorage
impl !UnwindSafe for TwoLevelStateStorage
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
Mutably borrows from an owned value. Read more
§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>
Converts
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn 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>
Converts
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which 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)
Converts
&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)
Converts
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSend for T
impl<T> DowncastSend for T
§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>
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 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>
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