Struct mmtk::scheduler::gc_work::PlanProcessEdges
source · pub struct PlanProcessEdges<VM: VMBinding, P: Plan<VM = VM> + PlanTraceObject<VM>, const KIND: u8> {
plan: &'static P,
base: ProcessEdgesBase<VM>,
}
Expand description
This provides an implementation of crate::scheduler::gc_work::ProcessEdgesWork
. A plan that implements
PlanTraceObject
can use this work packet for tracing objects.
Fields§
§plan: &'static P
§base: ProcessEdgesBase<VM>
Methods from Deref<Target = ProcessEdgesBase<VM>>§
pub fn set_worker(&mut self, worker: &mut GCWorker<VM>)
pub fn worker(&self) -> &'static mut GCWorker<VM>
pub fn mmtk(&self) -> &'static MMTK<VM>
pub fn plan(&self) -> &'static dyn Plan<VM = VM>
sourcepub fn pop_nodes(&mut self) -> Vec<ObjectReference>
pub fn pop_nodes(&mut self) -> Vec<ObjectReference>
Pop all nodes from nodes, and clear nodes to an empty vector.
pub fn is_roots(&self) -> bool
Trait Implementations§
source§impl<VM: VMBinding, P: PlanTraceObject<VM> + Plan<VM = VM>, const KIND: u8> DerefMut for PlanProcessEdges<VM, P, KIND>
impl<VM: VMBinding, P: PlanTraceObject<VM> + Plan<VM = VM>, const KIND: u8> DerefMut for PlanProcessEdges<VM, P, KIND>
source§impl<VM: VMBinding, P: PlanTraceObject<VM> + Plan<VM = VM>, const KIND: u8> ProcessEdgesWork for PlanProcessEdges<VM, P, KIND>
impl<VM: VMBinding, P: PlanTraceObject<VM> + Plan<VM = VM>, const KIND: u8> ProcessEdgesWork for PlanProcessEdges<VM, P, KIND>
§type ScanObjectsWorkType = PlanScanObjects<PlanProcessEdges<VM, P, KIND>, P>
type ScanObjectsWorkType = PlanScanObjects<PlanProcessEdges<VM, P, KIND>, P>
The work packet type for scanning objects when using this ProcessEdgesWork.
source§fn new(
slots: Vec<<<Self as ProcessEdgesWork>::VM as VMBinding>::VMSlot>,
roots: bool,
mmtk: &'static MMTK<VM>,
bucket: WorkBucketStage
) -> Self
fn new( slots: Vec<<<Self as ProcessEdgesWork>::VM as VMBinding>::VMSlot>, roots: bool, mmtk: &'static MMTK<VM>, bucket: WorkBucketStage ) -> Self
Create a
ProcessEdgesWork
. Read moresource§fn create_scan_work(
&self,
nodes: Vec<ObjectReference>
) -> Self::ScanObjectsWorkType
fn create_scan_work( &self, nodes: Vec<ObjectReference> ) -> Self::ScanObjectsWorkType
Create an object-scanning work packet to be used for this ProcessEdgesWork. Read more
source§fn trace_object(&mut self, object: ObjectReference) -> ObjectReference
fn trace_object(&mut self, object: ObjectReference) -> ObjectReference
Trace an MMTk object. The implementation should forward this call to the policy-specific
trace_object()
methods, depending on which space this object is in.
If the object is not in any MMTk space, the implementation should forward the call to
ActivePlan::vm_trace_object()
to let the binding handle the tracing.source§fn process_slot(
&mut self,
slot: <<Self as ProcessEdgesWork>::VM as VMBinding>::VMSlot
)
fn process_slot( &mut self, slot: <<Self as ProcessEdgesWork>::VM as VMBinding>::VMSlot )
Process a slot, including loading the object reference from the memory slot,
trace the object and store back the new object reference if necessary.
source§const CAPACITY: usize = 4_096usize
const CAPACITY: usize = 4_096usize
The maximum number of slots that should be put to one of this work packets.
The caller who creates a work packet of this trait should be responsible to
comply with this capacity.
Higher capacity means the packet will take longer to finish, and may lead to
bad load balancing. On the other hand, lower capacity would lead to higher cost
on scheduling many small work packets. It is important to find a proper capacity.
source§const OVERWRITE_REFERENCE: bool = true
const OVERWRITE_REFERENCE: bool = true
Do we update object reference? This has to be true for a moving GC.
source§const SCAN_OBJECTS_IMMEDIATELY: bool = true
const SCAN_OBJECTS_IMMEDIATELY: bool = true
If true, we do object scanning in this work packet with the same worker without scheduling overhead.
If false, we will add object scanning work packets to the global queue and allow other workers to work on it.
source§fn cache_roots_for_sanity_gc(&mut self)
fn cache_roots_for_sanity_gc(&mut self)
If the work includes roots, we will store the roots somewhere so for sanity GC, we can do another
transitive closure from the roots.
source§fn start_or_dispatch_scan_work(&mut self, work_packet: impl GCWork<Self::VM>)
fn start_or_dispatch_scan_work(&mut self, work_packet: impl GCWork<Self::VM>)
Start the a scan work packet. If SCAN_OBJECTS_IMMEDIATELY, the work packet will be executed immediately, in this method.
Otherwise, the work packet will be added the Closure work bucket and will be dispatched later by the scheduler.
source§fn flush(&mut self)
fn flush(&mut self)
Flush the nodes in ProcessEdgesBase, and create a ScanObjects work packet for it. If the node set is empty,
this method will simply return with no work packet created.
source§fn process_slots(&mut self)
fn process_slots(&mut self)
Process all the slots in the work packet.
source§impl<VM: VMBinding, P: PlanTraceObject<VM> + Plan<VM = VM>, const KIND: u8> Deref for PlanProcessEdges<VM, P, KIND>
impl<VM: VMBinding, P: PlanTraceObject<VM> + Plan<VM = VM>, const KIND: u8> Deref for PlanProcessEdges<VM, P, KIND>
Auto Trait Implementations§
impl<VM, P, const KIND: u8> !RefUnwindSafe for PlanProcessEdges<VM, P, KIND>
impl<VM, P, const KIND: u8> Send for PlanProcessEdges<VM, P, KIND>
impl<VM, P, const KIND: u8> !Sync for PlanProcessEdges<VM, P, KIND>
impl<VM, P, const KIND: u8> Unpin for PlanProcessEdges<VM, P, KIND>
impl<VM, P, const KIND: u8> !UnwindSafe for PlanProcessEdges<VM, P, KIND>
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
Mutably borrows from an owned value. Read more
§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>
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>
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)
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)
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<E> GCWork<<E as ProcessEdgesWork>::VM> for Ewhere
E: ProcessEdgesWork,
impl<E> GCWork<<E as ProcessEdgesWork>::VM> for Ewhere
E: ProcessEdgesWork,
source§fn do_work(
&mut self,
worker: &mut GCWorker<<E as ProcessEdgesWork>::VM>,
_mmtk: &'static MMTK<<E as ProcessEdgesWork>::VM>
)
fn do_work( &mut self, worker: &mut GCWorker<<E as ProcessEdgesWork>::VM>, _mmtk: &'static MMTK<<E as ProcessEdgesWork>::VM> )
Define the work for this packet. However, this is not supposed to be called directly.
Usually
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 and collect statistics. This internally calls
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
Get the compile-time static type name for the work packet.
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>
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 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>
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