use self::sched::DefaultScheduler;
use self::traits::*;
use super::*;
pub fn create_sched_factory() -> impl SchedulerFactory { Factory::new() }
struct Factory {
sender: SchedSender,
receiver: SchedReceiver,
}
impl Factory {
pub fn new() -> Self {
let (sender, receiver) = crossbeam::channel::unbounded::<SchedCmd>();
Self { sender, receiver }
}
pub fn get_sender(&self) -> SchedSender { self.sender.clone() }
pub fn create_and_start(&self, monitor: MonitorSender, queues: (TaskInjector, SchedTaskInjector)) -> impl Scheduler {
log::info!("creating Scheduler");
DefaultScheduler::new(self.sender.clone(), self.receiver.clone(), monitor, queues)
}
}
impl SchedulerFactory for Factory {
fn get_sender(&self) -> SchedSender { self.sender.clone() }
fn start(&self, monitor: MonitorSender, queues: (TaskInjector, SchedTaskInjector)) -> Arc<dyn Scheduler> {
Arc::new(self.create_and_start(monitor, queues))
}
}