dscale 0.4.0

A fast & deterministic simulation framework for testing and benchmarking distributed systems
Documentation
pub(crate) mod network_actor;
pub(crate) mod timer_actor;

use crate::{event::Event, global::local_access::EventBatch, jiffy::Jiffies, step::Step};

use network_actor::NetworkActor;
use timer_actor::TimerActor;

pub(crate) trait SimulationActor {
    fn next_step(&mut self) -> Step;
    fn peek_next_step(&self) -> Option<Jiffies>;
    fn submit(&mut self, event: Event);
}

pub(crate) struct Actors {
    pub(crate) network: NetworkActor,
    pub(crate) timers: TimerActor,
}

impl Actors {
    pub(super) fn next_step(&mut self) -> Step {
        let t = self.timers.peek_next_step();
        let n = self.network.peek_next_step();
        match (t, n) {
            (Some(a), Some(b)) if a <= b => self.timers.next_step(),
            (Some(_), Some(_)) => self.network.next_step(),
            (Some(_), None) => self.timers.next_step(),
            (None, Some(_)) => self.network.next_step(),
            (None, None) => panic!("next_step called with no pending steps"),
        }
    }

    pub(super) fn peek_next_step(&self) -> Option<Jiffies> {
        let t = self.timers.peek_next_step();
        let n = self.network.peek_next_step();
        match (t, n) {
            (Some(a), Some(b)) => Some(a.min(b)),
            (a, b) => a.or(b),
        }
    }

    pub(super) fn submit(&mut self, events: &mut EventBatch) {
        for event in events.drain(..) {
            match event {
                e @ Event::TimerEvent { .. } => self.timers.submit(e),
                e @ Event::NetworkEvent { .. } => self.network.submit(e),
            }
        }
    }
}