d3_core/scheduler/
traits.rs1use self::sched::SchedStats;
2use super::*;
3use crate::machine_impl::*;
4use crossbeam::deque;
5use d3_derive::*;
6
7#[allow(dead_code)]
11#[derive(Debug, Clone)]
12pub enum MonitorMessage {
13 Terminate,
15 AddSender(CoreStatsSender),
17 RemoveSender(CoreStatsSender),
19 Parked(usize),
21 Terminated(usize),
23 ExecutorStats(ExecutorStats),
25 SchedStats(SchedStats),
27 MachineInfo(ShareableMachine),
29}
30pub type MonitorSender = crossbeam::channel::Sender<MonitorMessage>;
31
32#[derive(Debug, Copy, Clone, MachineImpl)]
33pub enum CoreStatsMessage {
34 ExecutorStats(ExecutorStats),
36 SchedStats(SchedStats),
38}
39pub type CoreStatsSender = Sender<CoreStatsMessage>;
40
41pub trait MonitorFactory {
43 fn get_sender(&self) -> MonitorSender;
45 fn start(&self, executor: ExecutorControlObj) -> MonitorControlObj;
47}
48pub type MonitorFactoryObj = Arc<dyn MonitorFactory>;
49
50pub trait MonitorControl: Send + Sync {
52 fn stop(&self);
54 fn add_sender(&self, sender: CoreStatsSender);
56 fn remove_sender(&self, sender: CoreStatsSender);
58}
59pub type MonitorControlObj = Arc<dyn MonitorControl>;
60
61pub trait ExecutorFactory {
63 fn with_workers(&self, workers: usize);
65 fn get_queues(&self) -> (TaskInjector, SchedTaskInjector);
67 fn start(&self, monitor: MonitorSender, scheduler: SchedSender) -> ExecutorControlObj;
69}
70pub type ExecutorFactoryObj = Arc<dyn ExecutorFactory>;
71
72pub type TaskInjector = Arc<deque::Injector<Task>>;
74pub type SchedTaskInjector = Arc<deque::Injector<SchedTask>>;
75
76pub trait ExecutorControl: Send + Sync {
77 fn parked_executor(&self, id: usize);
79 fn wake_parked_threads(&self);
81 fn joinable_executor(&self, id: usize);
83 fn get_run_queue(&self) -> TaskInjector;
85 fn stop(&self);
87 fn request_stats(&self);
89}
90pub type ExecutorControlObj = Arc<dyn ExecutorControl>;
91
92#[allow(dead_code)]
94pub enum SchedCmd {
95 Start,
96 Stop,
97 Terminate(bool),
98 New(ShareableMachine),
99 SendComplete(usize),
100 Remove(usize),
101 ErrorRecv(usize),
102 RecvBlock(usize),
103 RequestStats,
104 RequestMachineInfo,
105 RebuildStealers,
107}
108pub type SchedSender = crossbeam::channel::Sender<SchedCmd>;
109pub type SchedReceiver = crossbeam::channel::Receiver<SchedCmd>;
110
111pub trait SchedulerFactory {
112 fn get_sender(&self) -> SchedSender;
113 fn start(&self, monitor: MonitorSender, queues: (TaskInjector, SchedTaskInjector)) -> Arc<dyn Scheduler>;
115}
116pub trait Scheduler: Send + Sync {
118 fn assign_machine(&self, machine: ShareableMachine);
120 fn request_stats(&self);
122 fn request_machine_info(&self);
124 fn stop(&self);
126}