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>

source

pub(crate) fn new(active: bool, monitor: Arc<WorkerMonitor>) -> Self

source

fn notify_one_worker(&self)

source

pub fn notify_all_workers(&self)

source

pub fn is_activated(&self) -> bool

source

pub fn activate(&self)

Enable the bucket

source

pub fn is_empty(&self) -> bool

Test if the bucket is drained

source

pub fn is_drained(&self) -> bool

source

pub fn deactivate(&self)

Disable the bucket

source

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.

source

pub fn add<W: GCWork<VM>>(&self, work: W)

Add a work packet to this bucket

source

pub fn add_boxed(&self, work: Box<dyn GCWork<VM>>)

Add a work packet to this bucket

source

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.

source

pub(crate) fn add_boxed_no_notify(&self, work: Box<dyn GCWork<VM>>)

Like WorkBucket::add_no_notify, but the work is boxed.

source

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.

source

pub fn bulk_add(&self, work_vec: Vec<Box<dyn GCWork<VM>>>)

Add multiple packets

source

pub fn poll( &self, worker: &Worker<Box<dyn GCWork<VM>>> ) -> Steal<Box<dyn GCWork<VM>>>

Get a work packet from this bucket

source

pub fn set_open_condition( &mut self, pred: impl Fn(&GCWorkScheduler<VM>) -> bool + Send + 'static )

source

pub fn set_sentinel(&self, new_sentinel: Box<dyn GCWork<VM>>)

source

pub fn has_sentinel(&self) -> bool

source

pub fn update(&self, scheduler: &GCWorkScheduler<VM>) -> bool

source

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> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert 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>

Convert 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)

Convert &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)

Convert &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> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

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 more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

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
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.