Skip to main content

dope_core/driver/schedule/
progress.rs

1use std::{mem, time};
2
3use o3::cell::region;
4
5use crate::driver::schedule;
6
7/// Aggregate liveness of retained work owned by one driver.
8#[must_use]
9#[derive(Clone, Copy, Debug, PartialEq, Eq)]
10pub enum Progress<'d> {
11    Runnable,
12    Waiting(schedule::Wait<'d>),
13    Quiescent,
14}
15
16impl<'d> Progress<'d> {
17    pub fn waiting(region: &region::Token<'d>) -> Self {
18        Self::Waiting(schedule::Wait::event(region))
19    }
20
21    pub fn until(region: &region::Token<'d>, deadline: time::Instant) -> Self {
22        Self::Waiting(schedule::Wait::until(region, deadline))
23    }
24
25    pub fn reduce(self, other: Self) -> Self {
26        match (self, other) {
27            (Self::Runnable, _) | (_, Self::Runnable) => Self::Runnable,
28            (Self::Waiting(left), Self::Waiting(right)) => Self::Waiting(left.reduce(right)),
29            (waiting @ Self::Waiting(_), Self::Quiescent)
30            | (Self::Quiescent, waiting @ Self::Waiting(_)) => waiting,
31            (Self::Quiescent, Self::Quiescent) => Self::Quiescent,
32        }
33    }
34}
35
36const _: () = assert!(mem::size_of::<Progress<'static>>() <= 24);