use super::worker::*;
use crate::plan::tracing::gc_work::root::DefaultRootsWorkFactory;
use crate::vm::{RootsWorkFactory, VMBinding};
use crate::{mmtk::MMTK, plan::tracing::Trace};
#[cfg(feature = "work_packet_stats")]
use std::any::{type_name, TypeId};
pub trait GCWork<VM: VMBinding>: 'static + Send {
fn do_work(&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>) {
debug!("{}", std::any::type_name::<Self>());
debug_assert!(!worker.tls.0.0.is_null(), "TLS must be set correctly for a GC worker before the worker does any work. GC Worker {} has no valid tls.", worker.ordinal);
#[cfg(feature = "work_packet_stats")]
let stat = {
let mut worker_stat = worker.shared.borrow_stat_mut();
worker_stat.measure_work(TypeId::of::<Self>(), type_name::<Self>(), mmtk)
};
self.do_work(worker, mmtk);
#[cfg(feature = "work_packet_stats")]
{
let mut worker_stat = worker.shared.borrow_stat_mut();
stat.end_of_work(&mut worker_stat);
}
}
fn get_type_name(&self) -> &'static str {
std::any::type_name::<Self>()
}
}
use crate::plan::Plan;
pub trait GCWorkContext: Send + 'static {
type VM: VMBinding;
type PlanType: Plan<VM = Self::VM>;
type DefaultTrace: Trace<VM = Self::VM>;
type PinningTrace: Trace<VM = Self::VM>;
fn make_roots_work_factory(
mmtk: &'static MMTK<Self::VM>,
) -> impl RootsWorkFactory<<Self::VM as VMBinding>::VMSlot> {
DefaultRootsWorkFactory::<Self::VM, Self::DefaultTrace, Self::PinningTrace>::new(mmtk)
}
}