use super::worker::*;
use crate::mmtk::MMTK;
use crate::vm::VMBinding;
#[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 super::gc_work::ProcessEdgesWork;
use crate::plan::Plan;
pub trait GCWorkContext: Send + 'static {
type VM: VMBinding;
type PlanType: Plan<VM = Self::VM>;
type DefaultProcessEdges: ProcessEdgesWork<VM = Self::VM>;
type PinningProcessEdges: ProcessEdgesWork<VM = Self::VM>;
}