Struct mmtk::scheduler::work_bucket::WorkBucket
source · pub struct WorkBucket<VM: VMBinding> {
active: AtomicBool,
queue: BucketQueue<VM>,
prioritized_queue: Option<BucketQueue<VM>>,
monitor: Arc<WorkerMonitor>,
can_open: Option<Box<dyn Fn(&GCWorkScheduler<VM>) -> bool + Send>>,
sentinel: Mutex<Option<Box<dyn GCWork<VM>>>>,
}
Fields§
§active: AtomicBool
§queue: BucketQueue<VM>
§prioritized_queue: Option<BucketQueue<VM>>
§monitor: Arc<WorkerMonitor>
§can_open: Option<Box<dyn Fn(&GCWorkScheduler<VM>) -> bool + Send>>
§sentinel: Mutex<Option<Box<dyn GCWork<VM>>>>
After this bucket is activated and all pending work packets (including the packets in this bucket) are drained, this work packet, if exists, will be added to this bucket. When this happens, it will prevent opening subsequent work packets.
The sentinel work packet may set another work packet as the new sentinel which will be added to this bucket again after all pending work packets are drained. This may happend again and again, causing the GC to stay at the same stage and drain work packets in a loop.
This is useful for handling weak references that may expand the transitive closure recursively, such as ephemerons and Java-style SoftReference and finalizers. Sentinels can be used repeatedly to discover and process more such objects.
Implementations§
source§impl<VM: VMBinding> WorkBucket<VM>
impl<VM: VMBinding> WorkBucket<VM>
pub(crate) fn new(active: bool, monitor: Arc<WorkerMonitor>) -> Self
fn notify_one_worker(&self)
pub fn notify_all_workers(&self)
pub fn is_activated(&self) -> bool
pub fn is_drained(&self) -> bool
sourcepub fn deactivate(&self)
pub fn deactivate(&self)
Disable the bucket
sourcepub fn add_prioritized(&self, work: Box<dyn GCWork<VM>>)
pub fn add_prioritized(&self, work: Box<dyn GCWork<VM>>)
Add a work packet to this bucket Panic if this bucket cannot receive prioritized packets.
sourcepub(crate) fn add_no_notify<W: GCWork<VM>>(&self, work: W)
pub(crate) fn add_no_notify<W: GCWork<VM>>(&self, work: W)
Add a work packet to this bucket, but do not notify any workers.
This is useful when the current thread is holding the mutex of WorkerMonitor
which is
used for notifying workers. This usually happens if the current thread is the last worker
parked.
sourcepub(crate) fn add_boxed_no_notify(&self, work: Box<dyn GCWork<VM>>)
pub(crate) fn add_boxed_no_notify(&self, work: Box<dyn GCWork<VM>>)
Like WorkBucket::add_no_notify
, but the work is boxed.
sourcepub fn bulk_add_prioritized(&self, work_vec: Vec<Box<dyn GCWork<VM>>>)
pub fn bulk_add_prioritized(&self, work_vec: Vec<Box<dyn GCWork<VM>>>)
Add multiple packets with a higher priority. Panic if this bucket cannot receive prioritized packets.
sourcepub fn poll(
&self,
worker: &Worker<Box<dyn GCWork<VM>>>
) -> Steal<Box<dyn GCWork<VM>>>
pub fn poll( &self, worker: &Worker<Box<dyn GCWork<VM>>> ) -> Steal<Box<dyn GCWork<VM>>>
Get a work packet from this bucket
pub fn set_open_condition( &mut self, pred: impl Fn(&GCWorkScheduler<VM>) -> bool + Send + 'static )
pub fn set_sentinel(&self, new_sentinel: Box<dyn GCWork<VM>>)
pub fn has_sentinel(&self) -> bool
pub fn update(&self, scheduler: &GCWorkScheduler<VM>) -> bool
pub fn maybe_schedule_sentinel(&self) -> bool
Auto Trait Implementations§
impl<VM> !RefUnwindSafe for WorkBucket<VM>
impl<VM> Send for WorkBucket<VM>
impl<VM> !Sync for WorkBucket<VM>
impl<VM> Unpin for WorkBucket<VM>
impl<VM> !UnwindSafe for WorkBucket<VM>
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.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