Struct mmtk::policy::marksweepspace::native_ms::block_list::BlockList
source · #[repr(C)]pub struct BlockList {
pub first: Option<Block>,
pub last: Option<Block>,
pub size: usize,
pub lock: AtomicBool,
}
Expand description
List of blocks owned by the allocator
Fields§
§first: Option<Block>
§last: Option<Block>
§size: usize
§lock: AtomicBool
Implementations§
source§impl BlockList
impl BlockList
const fn new(size: usize) -> BlockList
sourcepub fn append(&mut self, other: &mut BlockList)
pub fn append(&mut self, other: &mut BlockList)
Moves all the blocks of other
into self
, leaving other
empty.
sourcepub fn lock(&mut self)
pub fn lock(&mut self)
Lock the list. The MiMalloc allocator mostly uses thread-local block lists, and those operations on the list do not need synchronisation. However, in cases where a block list may be accessed by multiple threads, we need to lock the list before accessing it.
Our current sole use for locking is parallel sweeping. During the Release phase, multiple GC worker threads can
sweep chunks and release mutators at the same time, and the same BlockList
can be reached by traversing blocks in a chunk,
and also by traversing blocks held by a mutator. This lock is necessary to prevent
multiple GC workers from mutating the same BlockList
instance.
sourcepub fn iter(&self) -> BlockListIterator ⓘ
pub fn iter(&self) -> BlockListIterator ⓘ
Get an iterator for the block list.
sourcepub fn release_and_sweep_blocks<VM: VMBinding>(
&self,
space: &MarkSweepSpace<VM>
)
pub fn release_and_sweep_blocks<VM: VMBinding>( &self, space: &MarkSweepSpace<VM> )
Release unmarked blocks, and sweep other blocks in the block list. Used by eager sweeping.
sourcepub fn release_blocks<VM: VMBinding>(&self, space: &MarkSweepSpace<VM>)
pub fn release_blocks<VM: VMBinding>(&self, space: &MarkSweepSpace<VM>)
Release unmarked blocks, and do not sweep any blocks. Used by lazy sweeping
Trait Implementations§
Auto Trait Implementations§
impl RefUnwindSafe for BlockList
impl Send for BlockList
impl Sync for BlockList
impl Unpin for BlockList
impl UnwindSafe for BlockList
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