use crate::plan::Mutator;
use crate::plan::Plan;
use crate::scheduler::*;
use crate::util::OpaquePointer;
use crate::vm::VMBinding;
use std::marker::PhantomData;
use std::sync::MutexGuard;
pub struct SynchronizedMutatorIterator<'a, VM: VMBinding> {
_guard: MutexGuard<'a, ()>,
start: bool,
phantom: PhantomData<VM>,
}
impl<'a, VM: VMBinding> Iterator for SynchronizedMutatorIterator<'a, VM> {
type Item = &'static mut Mutator<VM>;
fn next(&mut self) -> Option<Self::Item> {
if self.start {
self.start = false;
VM::VMActivePlan::reset_mutator_iterator();
}
VM::VMActivePlan::get_next_mutator()
}
}
pub trait ActivePlan<VM: VMBinding> {
fn global() -> &'static dyn Plan<VM = VM>;
unsafe fn worker(tls: OpaquePointer) -> &'static mut GCWorker<VM>;
unsafe fn is_mutator(tls: OpaquePointer) -> bool;
unsafe fn mutator(tls: OpaquePointer) -> &'static mut Mutator<VM>;
fn reset_mutator_iterator();
fn get_next_mutator() -> Option<&'static mut Mutator<VM>>;
fn mutators<'a>() -> SynchronizedMutatorIterator<'a, VM> {
SynchronizedMutatorIterator {
_guard: Self::global().base().mutator_iterator_lock.lock().unwrap(),
start: true,
phantom: PhantomData,
}
}
fn number_of_mutators() -> usize;
}