pub struct SFTProcessEdges<VM: VMBinding> {
    pub base: ProcessEdgesBase<VM>,
}
Expand description

A general process edges implementation using SFT. A plan can always implement their own process edges. However, Most plans can use this work packet for tracing amd they do not need to provide a plan-specific trace object work packet. If they choose to use this type, they need to provide a correct implementation for some related methods (such as Space.set_copy_for_sft_trace(), SFT.sft_trace_object()). Some plans are not using this type, mostly due to more complex tracing. Either it is impossible to use this type, or there is performance overheads for using this general trace type. In such cases, they implement their specific process edges.

Fields§

§base: ProcessEdgesBase<VM>

Methods from Deref<Target = ProcessEdgesBase<VM>>§

source

pub fn set_worker(&mut self, worker: &mut GCWorker<VM>)

source

pub fn worker(&self) -> &'static mut GCWorker<VM>

source

pub fn mmtk(&self) -> &'static MMTK<VM>

source

pub fn plan(&self) -> &'static dyn Plan<VM = VM>

source

pub fn pop_nodes(&mut self) -> Vec<ObjectReference>

Pop all nodes from nodes, and clear nodes to an empty vector.

source

pub fn is_roots(&self) -> bool

Trait Implementations§

source§

impl<VM: VMBinding> DerefMut for SFTProcessEdges<VM>

source§

fn deref_mut(&mut self) -> &mut Self::Target

Mutably dereferences the value.
source§

impl<VM: VMBinding> ProcessEdgesWork for SFTProcessEdges<VM>

§

type VM = VM

The associate type for the VM.
§

type ScanObjectsWorkType = ScanObjects<SFTProcessEdges<VM>>

The work packet type for scanning objects when using this ProcessEdgesWork.
source§

fn new( edges: Vec<<<Self as ProcessEdgesWork>::VM as VMBinding>::VMEdge>, roots: bool, mmtk: &'static MMTK<VM>, bucket: WorkBucketStage ) -> Self

source§

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 create_scan_work(&self, nodes: Vec<ObjectReference>) -> ScanObjects<Self>

Create an object-scanning work packet to be used for this ProcessEdgesWork. Read more
source§

const CAPACITY: usize = 4_096usize

The maximum number of edges 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

Do we update object reference? This has to be true for a moving GC.
source§

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)

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

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)

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_edge( &mut self, slot: <<Self as ProcessEdgesWork>::VM as VMBinding>::VMEdge )

Process an edge, including loading the object reference from the memory slot, trace the object and store back the new object reference if necessary.
source§

fn process_edges(&mut self)

Process all the edges in the work packet.
source§

impl<VM: VMBinding> Deref for SFTProcessEdges<VM>

§

type Target = ProcessEdgesBase<VM>

The resulting type after dereferencing.
source§

fn deref(&self) -> &Self::Target

Dereferences the value.

Auto Trait Implementations§

§

impl<VM> !RefUnwindSafe for SFTProcessEdges<VM>

§

impl<VM> Send for SFTProcessEdges<VM>

§

impl<VM> !Sync for SFTProcessEdges<VM>

§

impl<VM> Unpin for SFTProcessEdges<VM>
where <VM as VMBinding>::VMEdge: Unpin,

§

impl<VM> !UnwindSafe for SFTProcessEdges<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<E> GCWork<<E as ProcessEdgesWork>::VM> for E

source§

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

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

Get the compile-time static type name for the work packet.
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.