#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum SchedulePolicy {
Fifo,
Lifo,
RoundRobin,
Random,
Priority,
}
impl Default for SchedulePolicy {
fn default() -> Self {
SchedulePolicy::Fifo
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ClockMode {
Logical,
Wall,
}
impl Default for ClockMode {
fn default() -> Self {
ClockMode::Logical
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct SchedulerConfig {
pub policy: SchedulePolicy,
pub clock: ClockMode,
pub default_channel_capacity: usize,
pub preempt_every: u32,
pub workers: usize,
}
impl Default for SchedulerConfig {
fn default() -> Self {
SchedulerConfig {
policy: SchedulePolicy::Fifo,
clock: ClockMode::Logical,
default_channel_capacity: 32,
preempt_every: 10_000,
workers: 1,
}
}
}
impl SchedulerConfig {
pub fn with_policy(mut self, policy: SchedulePolicy) -> Self {
self.policy = policy;
self
}
pub fn with_clock(mut self, clock: ClockMode) -> Self {
self.clock = clock;
self
}
pub fn with_channel_capacity(mut self, capacity: usize) -> Self {
self.default_channel_capacity = capacity;
self
}
pub fn with_workers(mut self, workers: usize) -> Self {
self.workers = workers;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn policy_default_is_fifo() {
assert_eq!(SchedulerConfig::default().policy, SchedulePolicy::Fifo);
assert_eq!(SchedulePolicy::default(), SchedulePolicy::Fifo);
}
#[test]
fn config_default_is_the_nice_baseline() {
let c = SchedulerConfig::default();
assert_eq!(c.clock, ClockMode::Logical);
assert_eq!(c.default_channel_capacity, 32);
assert_eq!(c.workers, 1);
}
#[test]
fn builder_overrides_apply() {
let c = SchedulerConfig::default()
.with_policy(SchedulePolicy::Random)
.with_channel_capacity(4)
.with_workers(8);
assert_eq!(c.policy, SchedulePolicy::Random);
assert_eq!(c.default_channel_capacity, 4);
assert_eq!(c.workers, 8);
assert_eq!(c.clock, ClockMode::Logical, "untouched knobs keep defaults");
}
}