Skip to main content

dope_core/driver/schedule/
wait.rs

1//! Scheduler wait evidence.
2
3use std::{marker, time};
4
5use o3::cell::region;
6
7/// Driver-scoped evidence that a retained owner is waiting for an external
8/// wake or a monotonic deadline.
9#[must_use]
10#[derive(Clone, Copy, Debug, PartialEq, Eq)]
11#[repr(transparent)]
12pub struct Wait<'d> {
13    deadline: Option<time::Instant>,
14    _driver: marker::PhantomData<fn(&'d ()) -> &'d ()>,
15}
16
17impl<'d> Wait<'d> {
18    pub fn event(_region: &region::Token<'d>) -> Self {
19        Self {
20            deadline: None,
21            _driver: marker::PhantomData,
22        }
23    }
24
25    pub fn until(_region: &region::Token<'d>, deadline: time::Instant) -> Self {
26        Self {
27            deadline: Some(deadline),
28            _driver: marker::PhantomData,
29        }
30    }
31
32    pub const fn deadline(self) -> Option<time::Instant> {
33        self.deadline
34    }
35
36    pub(super) fn reduce(self, other: Self) -> Self {
37        let deadline = match (self.deadline, other.deadline) {
38            (Some(left), Some(right)) => Some(left.min(right)),
39            (left, right) => left.or(right),
40        };
41        Self {
42            deadline,
43            _driver: marker::PhantomData,
44        }
45    }
46}