wasi_common/sched/
subscription.rs1use 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}