diff --git a/crates/wasi-c2/TEST_FAILURES b/crates/wasi-c2/TEST_FAILURES index 4394803135..f3cb28ee13 100644 --- a/crates/wasi-c2/TEST_FAILURES +++ b/crates/wasi-c2/TEST_FAILURES @@ -25,5 +25,3 @@ wasi_tests::path_filestat wasi_tests::poll_oneoff - no sched yet -wasi_tests::sched_yield - - no sched yet diff --git a/crates/wasi-c2/src/ctx.rs b/crates/wasi-c2/src/ctx.rs index 716002ce5a..b9e74e3c18 100644 --- a/crates/wasi-c2/src/ctx.rs +++ b/crates/wasi-c2/src/ctx.rs @@ -1,6 +1,7 @@ use crate::clocks::{WasiMonotonicClock, WasiSystemClock}; use crate::dir::{DirCaps, DirEntry, WasiDir}; use crate::file::{FileCaps, FileEntry, WasiFile}; +use crate::sched::{SyncSched, WasiSched}; use crate::string_array::{StringArray, StringArrayError}; use crate::table::Table; use crate::Error; @@ -14,6 +15,7 @@ pub struct WasiCtx { pub(crate) env: StringArray, pub(crate) random: RefCell>, pub(crate) clocks: WasiCtxClocks, + pub(crate) sched: Box, table: Rc>, } @@ -28,6 +30,7 @@ impl WasiCtx { env: StringArray::new(), random: RefCell::new(Box::new(unsafe { cap_rand::rngs::OsRng::default() })), clocks: WasiCtxClocks::default(), + sched: Box::new(SyncSched::default()), table: Rc::new(RefCell::new(Table::new())), } } diff --git a/crates/wasi-c2/src/lib.rs b/crates/wasi-c2/src/lib.rs index ac2844f8bf..71fb8a3122 100644 --- a/crates/wasi-c2/src/lib.rs +++ b/crates/wasi-c2/src/lib.rs @@ -6,6 +6,7 @@ mod dir; mod error; mod file; pub mod random; +pub mod sched; pub mod snapshots; pub mod stdio; mod string_array; diff --git a/crates/wasi-c2/src/sched.rs b/crates/wasi-c2/src/sched.rs new file mode 100644 index 0000000000..635a96cb6d --- /dev/null +++ b/crates/wasi-c2/src/sched.rs @@ -0,0 +1,20 @@ +use crate::Error; + +pub trait WasiSched { + // XXX poll oneoff needs args and results. + fn poll_oneoff(&self) -> Result<(), Error>; + fn sched_yield(&self) -> Result<(), Error>; +} + +#[derive(Default)] +pub struct SyncSched {} + +impl WasiSched for SyncSched { + fn poll_oneoff(&self) -> Result<(), Error> { + todo!() + } + fn sched_yield(&self) -> Result<(), Error> { + std::thread::yield_now(); + Ok(()) + } +} diff --git a/crates/wasi-c2/src/snapshots/preview_1.rs b/crates/wasi-c2/src/snapshots/preview_1.rs index 7898f864f5..037521b162 100644 --- a/crates/wasi-c2/src/snapshots/preview_1.rs +++ b/crates/wasi-c2/src/snapshots/preview_1.rs @@ -886,7 +886,8 @@ impl<'a> wasi_snapshot_preview1::WasiSnapshotPreview1 for WasiCtx { events: &GuestPtr, nsubscriptions: types::Size, ) -> Result { - unimplemented!() + self.sched.poll_oneoff()?; + Ok(0) } fn proc_exit(&self, status: types::Exitcode) -> wiggle::Trap { @@ -903,7 +904,7 @@ impl<'a> wasi_snapshot_preview1::WasiSnapshotPreview1 for WasiCtx { } fn sched_yield(&self) -> Result<(), Error> { - unimplemented!() + self.sched.sched_yield() } fn random_get(&self, buf: &GuestPtr, buf_len: types::Size) -> Result<(), Error> {