use crate::plan::Mutator;
use crate::util::ObjectReference;
use crate::util::VMWorkerThread;
use crate::vm::edge_shape::Edge;
use crate::vm::VMBinding;
pub trait EdgeVisitor<ES: Edge> {
fn visit_edge(&mut self, edge: ES);
}
impl<ES: Edge, F: FnMut(ES)> EdgeVisitor<ES> for F {
fn visit_edge(&mut self, edge: ES) {
self(edge)
}
}
pub trait ObjectTracer {
fn trace_object(&mut self, object: ObjectReference) -> ObjectReference;
}
impl<F: FnMut(ObjectReference) -> ObjectReference> ObjectTracer for F {
fn trace_object(&mut self, object: ObjectReference) -> ObjectReference {
self(object)
}
}
pub trait RootsWorkFactory<ES: Edge>: Clone + Send + 'static {
fn create_process_edge_roots_work(&mut self, edges: Vec<ES>);
fn create_process_node_roots_work(&mut self, nodes: Vec<ObjectReference>);
}
pub trait Scanning<VM: VMBinding> {
const SCAN_MUTATORS_IN_SAFEPOINT: bool = true;
const SINGLE_THREAD_MUTATOR_SCANNING: bool = true;
#[inline(always)]
fn support_edge_enqueuing(_tls: VMWorkerThread, _object: ObjectReference) -> bool {
true
}
fn scan_object<EV: EdgeVisitor<VM::VMEdge>>(
tls: VMWorkerThread,
object: ObjectReference,
edge_visitor: &mut EV,
);
fn scan_object_and_trace_edges<OT: ObjectTracer>(
_tls: VMWorkerThread,
_object: ObjectReference,
_object_tracer: &mut OT,
) {
unreachable!("scan_object_and_trace_edges() will not be called when support_edge_enqueue() is always true.")
}
fn notify_initial_thread_scan_complete(partial_scan: bool, tls: VMWorkerThread);
fn scan_thread_roots(tls: VMWorkerThread, factory: impl RootsWorkFactory<VM::VMEdge>);
fn scan_thread_root(
tls: VMWorkerThread,
mutator: &'static mut Mutator<VM>,
factory: impl RootsWorkFactory<VM::VMEdge>,
);
fn scan_vm_specific_roots(tls: VMWorkerThread, factory: impl RootsWorkFactory<VM::VMEdge>);
fn supports_return_barrier() -> bool;
fn prepare_for_roots_re_scanning();
}