mmtk/plan/concurrent/immix/
gc_work.rs

1use crate::plan::concurrent::concurrent_marking_work::ConcurrentMarkingRootsWorkFactory;
2use crate::plan::concurrent::immix::global::ConcurrentImmix;
3use crate::plan::tracing::PlanTrace;
4use crate::policy::gc_work::{TraceKind, TRACE_KIND_TRANSITIVE_PIN};
5use crate::policy::immix::TRACE_KIND_FAST;
6use crate::vm::VMBinding;
7
8/// The `GCWorkContext` implementation for the fall-back stop-the-world GC in ConcurrentImmix.
9pub(super) struct ConcurrentImmixSTWGCWorkContext<VM: VMBinding, const KIND: TraceKind>(
10    std::marker::PhantomData<VM>,
11);
12
13impl<VM: VMBinding, const KIND: TraceKind> crate::scheduler::GCWorkContext
14    for ConcurrentImmixSTWGCWorkContext<VM, KIND>
15{
16    type VM = VM;
17    type PlanType = ConcurrentImmix<VM>;
18    type DefaultTrace = PlanTrace<ConcurrentImmix<VM>, KIND>;
19    type PinningTrace = PlanTrace<ConcurrentImmix<VM>, TRACE_KIND_TRANSITIVE_PIN>;
20}
21
22/// The `GCWorkContext` implementation for concurrent marking.  Note that it overrides the
23/// `RootsWorkFactory`.
24pub(super) struct ConcurrentImmixGCWorkContext<VM>(std::marker::PhantomData<VM>);
25
26impl<VM: VMBinding> crate::scheduler::GCWorkContext for ConcurrentImmixGCWorkContext<VM> {
27    type VM = VM;
28    type PlanType = ConcurrentImmix<VM>;
29    type DefaultTrace = PlanTrace<Self::PlanType, TRACE_KIND_FAST>;
30    type PinningTrace = PlanTrace<Self::PlanType, TRACE_KIND_FAST>;
31
32    fn make_roots_work_factory(
33        mmtk: &'static crate::MMTK<Self::VM>,
34    ) -> impl crate::vm::RootsWorkFactory<<Self::VM as VMBinding>::VMSlot> {
35        ConcurrentMarkingRootsWorkFactory::<Self::VM, Self::PlanType, TRACE_KIND_FAST>::new(mmtk)
36    }
37}