Path: blob/main/crates/wasi-common/src/sched.rs
1691 views
use crate::Error;1use crate::clocks::WasiMonotonicClock;2use crate::file::WasiFile;3use cap_std::time::Instant;4pub mod subscription;5pub use cap_std::time::Duration;67pub use subscription::{8MonotonicClockSubscription, RwEventFlags, RwSubscription, Subscription, SubscriptionResult,9};1011#[wiggle::async_trait]12pub trait WasiSched: Send + Sync {13async fn poll_oneoff<'a>(&self, poll: &mut Poll<'a>) -> Result<(), Error>;14async fn sched_yield(&self) -> Result<(), Error>;15async fn sleep(&self, duration: Duration) -> Result<(), Error>;16}1718#[derive(Debug, Copy, Clone, PartialEq, Eq)]19pub struct Userdata(u64);20impl From<u64> for Userdata {21fn from(u: u64) -> Userdata {22Userdata(u)23}24}2526impl From<Userdata> for u64 {27fn from(u: Userdata) -> u64 {28u.029}30}3132pub type PollResults = Vec<(SubscriptionResult, Userdata)>;3334pub struct Poll<'a> {35subs: Vec<(Subscription<'a>, Userdata)>,36}3738impl<'a> Poll<'a> {39pub fn new() -> Self {40Self { subs: Vec::new() }41}42pub fn subscribe_monotonic_clock(43&mut self,44clock: &'a dyn WasiMonotonicClock,45deadline: Instant,46precision: Duration,47ud: Userdata,48) {49self.subs.push((50Subscription::MonotonicClock(MonotonicClockSubscription {51clock,52deadline,53precision,54}),55ud,56));57}58pub fn subscribe_read(&mut self, file: &'a dyn WasiFile, ud: Userdata) {59self.subs60.push((Subscription::Read(RwSubscription::new(file)), ud));61}62pub fn subscribe_write(&mut self, file: &'a dyn WasiFile, ud: Userdata) {63self.subs64.push((Subscription::Write(RwSubscription::new(file)), ud));65}66pub fn results(self) -> Vec<(SubscriptionResult, Userdata)> {67self.subs68.into_iter()69.filter_map(|(s, ud)| SubscriptionResult::from_subscription(s).map(|r| (r, ud)))70.collect()71}72pub fn is_empty(&self) -> bool {73self.subs.is_empty()74}75pub fn earliest_clock_deadline(&self) -> Option<&MonotonicClockSubscription<'a>> {76self.subs77.iter()78.filter_map(|(s, _ud)| match s {79Subscription::MonotonicClock(t) => Some(t),80_ => None,81})82.min_by(|a, b| a.deadline.cmp(&b.deadline))83}84pub fn rw_subscriptions<'b>(&'b mut self) -> impl Iterator<Item = &'b mut Subscription<'a>> {85self.subs.iter_mut().filter_map(|(s, _ud)| match s {86Subscription::Read { .. } | Subscription::Write { .. } => Some(s),87_ => None,88})89}90}919293