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