pub(crate) struct ProcessPinningRoots<VM: VMBinding, R2OT: Trace<VM = VM>, O2OT: Trace<VM = VM>> {
phantom: PhantomData<(VM, R2OT, O2OT)>,
roots: Vec<ObjectReference>,
bucket: WorkBucketStage,
}Expand description
This work packet processes pinning roots during stop-the-world tracing GC.
Note that by definition, a “root” is an edge from outside the object graph to an object. This
work packet represents each edge as the ObjectReference of the object the edge points to (i.e.
the referent). Because pinning roots by definition cannot be updated, we don’t need to
represent the edges as Slot.
The roots member holds a list of ObjectReference to objects directly pointed by roots. These
objects will be traced using R2OT (Root-to-Object Trace).
After that, it will create work packets for tracing their children. Those work packets (and the
work packets further created by them) will use O2OT (Object-to-Object Trace) as their Trace
implementations.
Because roots are pinning roots, R2OT must be a Trace that never moves any object.
The choice of O2OT determines whether the roots are transitively pinning or not.
- If
O2OTis set to aTracethat never moves objects, no descendents ofrootswill be moved in this GC. That implements transitive pinning roots. - If
O2OTmay move objects, then thisProcessRootsNode<VM, R2OT, O2OT>work packet will only pin the objects inroots(becauseR2OTmust not move objects anyway), but not their descendents.
Fields§
§phantom: PhantomData<(VM, R2OT, O2OT)>§roots: Vec<ObjectReference>§bucket: WorkBucketStageImplementations§
Source§impl<VM: VMBinding, R2OT: Trace<VM = VM>, O2OT: Trace<VM = VM>> ProcessPinningRoots<VM, R2OT, O2OT>
impl<VM: VMBinding, R2OT: Trace<VM = VM>, O2OT: Trace<VM = VM>> ProcessPinningRoots<VM, R2OT, O2OT>
pub fn new(nodes: Vec<ObjectReference>, bucket: WorkBucketStage) -> Self
Trait Implementations§
Source§impl<VM: VMBinding, R2OT: Trace<VM = VM>, O2OT: Trace<VM = VM>> GCWork<VM> for ProcessPinningRoots<VM, R2OT, O2OT>
impl<VM: VMBinding, R2OT: Trace<VM = VM>, O2OT: Trace<VM = VM>> GCWork<VM> for ProcessPinningRoots<VM, R2OT, O2OT>
Source§fn do_work(&mut self, worker: &mut GCWorker<VM>, mmtk: &'static MMTK<VM>)
fn do_work(&mut self, worker: &mut GCWorker<VM>, mmtk: &'static MMTK<VM>)
do_work_with_stat() should be used. Read moreSource§fn do_work_with_stat(
&mut self,
worker: &mut GCWorker<VM>,
mmtk: &'static MMTK<VM>,
)
fn do_work_with_stat( &mut self, worker: &mut GCWorker<VM>, mmtk: &'static MMTK<VM>, )
do_work(). In most cases,
this should be called rather than do_work() so that MMTk can correctly collect
statistics for the work packets.
If the feature “work_packet_stats” is not enabled, this call simply forwards the call
to do_work().Source§fn get_type_name(&self) -> &'static str
fn get_type_name(&self) -> &'static str
Auto Trait Implementations§
impl<VM, R2OT, O2OT> Freeze for ProcessPinningRoots<VM, R2OT, O2OT>
impl<VM, R2OT, O2OT> RefUnwindSafe for ProcessPinningRoots<VM, R2OT, O2OT>
impl<VM, R2OT, O2OT> Send for ProcessPinningRoots<VM, R2OT, O2OT>
impl<VM, R2OT, O2OT> Sync for ProcessPinningRoots<VM, R2OT, O2OT>
impl<VM, R2OT, O2OT> Unpin for ProcessPinningRoots<VM, R2OT, O2OT>
impl<VM, R2OT, O2OT> UnwindSafe for ProcessPinningRoots<VM, R2OT, O2OT>
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>, 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>
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)
&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> 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>
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