trait MapStateStorage {
// Required methods
fn log_mappable_bytes(&self) -> u8;
fn get_state(&self, chunk: Address) -> MapState;
fn bulk_set_state(&self, range: ChunkRange, state: MapState);
fn bulk_transition_state<F>(
&self,
range: ChunkRange,
update_fn: F,
) -> Result<()>
where F: FnMut(ChunkRange, MapState) -> Result<Option<MapState>>;
}Expand description
The back-end storage of ChunkStateMmapper. It is responsible for holding the states of each
chunk (eagerly or lazily) and transitioning the states in bulk.
Required Methods§
sourcefn log_mappable_bytes(&self) -> u8
fn log_mappable_bytes(&self) -> u8
The logarithm of the address space size this MapStateStorage can handle.
sourcefn get_state(&self, chunk: Address) -> MapState
fn get_state(&self, chunk: Address) -> MapState
Return the state of a given chunk (must be aligned).
Note that all chunks are logically MapState::Unmapped before the states are stored. They
include chunks outside the mappable address range.
sourcefn bulk_set_state(&self, range: ChunkRange, state: MapState)
fn bulk_set_state(&self, range: ChunkRange, state: MapState)
Set all chunks within range to state.
sourcefn 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.
It visits chunks from low to high addresses, and calls update_fn(group_range, group_state)
for each contiguous chunk range group_range that have the same state group_state.
update_fn can take actions accordingly and return one of the three values:
Err(err): Stop visiting and returnErr(err)frombulk_transition_stateimmediately.Ok(None): Continue visiting the next chunk range without changing chunk states.Ok(Some(new_state)): Set the state of all chunks withingroup_rangetonew_state.
Return Ok(()) if finished visiting all chunks normally.