Path: blob/main/crates/wasi-common/src/sched/subscription.rs
1692 views
use crate::Error;1use crate::clocks::WasiMonotonicClock;2use crate::file::WasiFile;3use bitflags::bitflags;4use cap_std::time::{Duration, Instant};56bitflags! {7#[derive(Copy, Clone, Debug, PartialEq, Eq)]8pub struct RwEventFlags: u32 {9const HANGUP = 0b1;10}11}1213pub struct RwSubscription<'a> {14pub file: &'a dyn WasiFile,15status: Option<Result<(u64, RwEventFlags), Error>>,16}1718impl<'a> RwSubscription<'a> {19pub fn new(file: &'a dyn WasiFile) -> Self {20Self { file, status: None }21}22pub fn complete(&mut self, size: u64, flags: RwEventFlags) {23self.status = Some(Ok((size, flags)))24}25pub fn error(&mut self, error: Error) {26self.status = Some(Err(error))27}28pub fn result(&mut self) -> Option<Result<(u64, RwEventFlags), Error>> {29self.status.take()30}31}3233pub struct MonotonicClockSubscription<'a> {34pub clock: &'a dyn WasiMonotonicClock,35pub deadline: Instant,36pub precision: Duration,37}3839impl<'a> MonotonicClockSubscription<'a> {40pub fn now(&self) -> Instant {41self.clock.now(self.precision)42}43pub fn duration_until(&self) -> Option<Duration> {44self.deadline.checked_duration_since(self.now())45}46pub fn result(&self) -> Option<Result<(), Error>> {47if self.now().checked_duration_since(self.deadline).is_some() {48Some(Ok(()))49} else {50None51}52}53}5455pub enum Subscription<'a> {56Read(RwSubscription<'a>),57Write(RwSubscription<'a>),58MonotonicClock(MonotonicClockSubscription<'a>),59}6061#[derive(Debug)]62pub enum SubscriptionResult {63Read(Result<(u64, RwEventFlags), Error>),64Write(Result<(u64, RwEventFlags), Error>),65MonotonicClock(Result<(), Error>),66}6768impl SubscriptionResult {69pub fn from_subscription(s: Subscription) -> Option<SubscriptionResult> {70match s {71Subscription::Read(mut s) => s.result().map(SubscriptionResult::Read),72Subscription::Write(mut s) => s.result().map(SubscriptionResult::Write),73Subscription::MonotonicClock(s) => s.result().map(SubscriptionResult::MonotonicClock),74}75}76}777879