Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/wasi-common/src/sched/subscription.rs
1692 views
1
use crate::Error;
2
use crate::clocks::WasiMonotonicClock;
3
use crate::file::WasiFile;
4
use bitflags::bitflags;
5
use cap_std::time::{Duration, Instant};
6
7
bitflags! {
8
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
9
pub struct RwEventFlags: u32 {
10
const HANGUP = 0b1;
11
}
12
}
13
14
pub struct RwSubscription<'a> {
15
pub file: &'a dyn WasiFile,
16
status: Option<Result<(u64, RwEventFlags), Error>>,
17
}
18
19
impl<'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
34
pub struct MonotonicClockSubscription<'a> {
35
pub clock: &'a dyn WasiMonotonicClock,
36
pub deadline: Instant,
37
pub precision: Duration,
38
}
39
40
impl<'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
56
pub enum Subscription<'a> {
57
Read(RwSubscription<'a>),
58
Write(RwSubscription<'a>),
59
MonotonicClock(MonotonicClockSubscription<'a>),
60
}
61
62
#[derive(Debug)]
63
pub enum SubscriptionResult {
64
Read(Result<(u64, RwEventFlags), Error>),
65
Write(Result<(u64, RwEventFlags), Error>),
66
MonotonicClock(Result<(), Error>),
67
}
68
69
impl 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
}
78
79