use self::sched::SchedStats;
use super::*;
use crate::machine_impl::*;
use crossbeam::deque;
use d3_derive::*;
#[allow(dead_code)]
#[derive(Debug, Clone)]
pub enum MonitorMessage {
Terminate,
AddSender(CoreStatsSender),
RemoveSender(CoreStatsSender),
Parked(usize),
Terminated(usize),
ExecutorStats(ExecutorStats),
SchedStats(SchedStats),
MachineInfo(ShareableMachine),
}
pub type MonitorSender = crossbeam::channel::Sender<MonitorMessage>;
#[derive(Debug, Copy, Clone, MachineImpl)]
pub enum CoreStatsMessage {
ExecutorStats(ExecutorStats),
SchedStats(SchedStats),
}
pub type CoreStatsSender = Sender<CoreStatsMessage>;
pub trait MonitorFactory {
fn get_sender(&self) -> MonitorSender;
fn start(&self, executor: ExecutorControlObj) -> MonitorControlObj;
}
pub type MonitorFactoryObj = Arc<dyn MonitorFactory>;
pub trait MonitorControl: Send + Sync {
fn stop(&self);
fn add_sender(&self, sender: CoreStatsSender);
fn remove_sender(&self, sender: CoreStatsSender);
}
pub type MonitorControlObj = Arc<dyn MonitorControl>;
pub trait ExecutorFactory {
fn with_workers(&self, workers: usize);
fn get_queues(&self) -> (TaskInjector, SchedTaskInjector);
fn start(&self, monitor: MonitorSender, scheduler: SchedSender) -> ExecutorControlObj;
}
pub type ExecutorFactoryObj = Arc<dyn ExecutorFactory>;
pub type TaskInjector = Arc<deque::Injector<Task>>;
pub type SchedTaskInjector = Arc<deque::Injector<SchedTask>>;
pub trait ExecutorControl: Send + Sync {
fn parked_executor(&self, id: usize);
fn wake_parked_threads(&self);
fn joinable_executor(&self, id: usize);
fn get_run_queue(&self) -> TaskInjector;
fn stop(&self);
fn request_stats(&self);
}
pub type ExecutorControlObj = Arc<dyn ExecutorControl>;
#[allow(dead_code)]
pub enum SchedCmd {
Start,
Stop,
Terminate(bool),
New(ShareableMachine),
SendComplete(usize),
Remove(usize),
ErrorRecv(usize),
RecvBlock(usize),
RequestStats,
RequestMachineInfo,
RebuildStealers,
}
pub type SchedSender = crossbeam::channel::Sender<SchedCmd>;
pub type SchedReceiver = crossbeam::channel::Receiver<SchedCmd>;
pub trait SchedulerFactory {
fn get_sender(&self) -> SchedSender;
fn start(&self, monitor: MonitorSender, queues: (TaskInjector, SchedTaskInjector)) -> Arc<dyn Scheduler>;
}
pub trait Scheduler: Send + Sync {
fn assign_machine(&self, machine: ShareableMachine);
fn request_stats(&self);
fn request_machine_info(&self);
fn stop(&self);
}