wasi_common/sched/
subscription.rs

1use crate::clocks::WasiMonotonicClock;
2use crate::file::WasiFile;
3use crate::Error;
4use bitflags::bitflags;
5use cap_std::time::{Duration, Instant};
6
7bitflags! {
8    #[derive(Copy, Clone, Debug, PartialEq, Eq)]
9    pub struct RwEventFlags: u32 {
10        const HANGUP = 0b1;
11    }
12}
13
14pub struct RwSubscription<'a> {
15    pub file: &'a dyn WasiFile,
16    status: Option<Result<(u64, RwEventFlags), Error>>,
17}
18
19impl<'a> RwSubscription<'a> {
20    pub fn new(file: &'a dyn WasiFile) -> Self {
21        Self { file, status: None }
22    }
23    pub fn complete(&mut self, size: u64, flags: RwEventFlags) {
24        self.status = Some(Ok((size, flags)))
25    }
26    pub fn error(&mut self, error: Error) {
27        self.status = Some(Err(error))
28    }
29    pub fn result(&mut self) -> Option<Result<(u64, RwEventFlags), Error>> {
30        self.status.take()
31    }
32}
33
34pub struct MonotonicClockSubscription<'a> {
35    pub clock: &'a dyn WasiMonotonicClock,
36    pub deadline: Instant,
37    pub precision: Duration,
38}
39
40impl<'a> MonotonicClockSubscription<'a> {
41    pub fn now(&self) -> Instant {
42        self.clock.now(self.precision)
43    }
44    pub fn duration_until(&self) -> Option<Duration> {
45        self.deadline.checked_duration_since(self.now())
46    }
47    pub fn result(&self) -> Option<Result<(), Error>> {
48        if self.now().checked_duration_since(self.deadline).is_some() {
49            Some(Ok(()))
50        } else {
51            None
52        }
53    }
54}
55
56pub enum Subscription<'a> {
57    Read(RwSubscription<'a>),
58    Write(RwSubscription<'a>),
59    MonotonicClock(MonotonicClockSubscription<'a>),
60}
61
62#[derive(Debug)]
63pub enum SubscriptionResult {
64    Read(Result<(u64, RwEventFlags), Error>),
65    Write(Result<(u64, RwEventFlags), Error>),
66    MonotonicClock(Result<(), Error>),
67}
68
69impl SubscriptionResult {
70    pub fn from_subscription(s: Subscription) -> Option<SubscriptionResult> {
71        match s {
72            Subscription::Read(mut s) => s.result().map(SubscriptionResult::Read),
73            Subscription::Write(mut s) => s.result().map(SubscriptionResult::Write),
74            Subscription::MonotonicClock(s) => s.result().map(SubscriptionResult::MonotonicClock),
75        }
76    }
77}