diff --git a/core/Cargo.toml b/core/Cargo.toml index 3752aa23e..e4c4b3b25 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -20,7 +20,7 @@ fs = [] [target.'cfg(target_os = "linux")'.dependencies] io-uring = "0.6.1" -[target.'cfg(not(target_os = "linux"))'.dependencies] +[target.'cfg(target_os = "macos")'.dependencies] polling = "3.7.2" rustix = "0.38.34" diff --git a/core/io/generic.rs b/core/io/generic.rs new file mode 100644 index 000000000..55dbdfb90 --- /dev/null +++ b/core/io/generic.rs @@ -0,0 +1,60 @@ +use super::{Completion, File, WriteCompletion, IO}; +use anyhow::{Ok, Result}; +use log::trace; +use std::cell::RefCell; +use std::io::{Read, Seek, Write}; +use std::rc::Rc; + +pub struct GenericIO {} + +impl GenericIO { + pub fn new() -> Result { + Ok(Self {}) + } +} + +impl IO for GenericIO { + fn open_file(&self, path: &str) -> Result> { + trace!("open_file(path = {})", path); + let file = std::fs::File::open(path)?; + Ok(Rc::new(GenericFile { + file: RefCell::new(file), + })) + } + + fn run_once(&self) -> Result<()> { + Ok(()) + } +} + +pub struct GenericFile { + file: RefCell, +} + +impl File for GenericFile { + fn pread(&self, pos: usize, c: Rc) -> Result<()> { + let mut file = self.file.borrow_mut(); + file.seek(std::io::SeekFrom::Start(pos as u64))?; + { + let mut buf = c.buf_mut(); + let buf = buf.as_mut_slice(); + file.read_exact(buf)?; + } + c.complete(); + Ok(()) + } + + fn pwrite( + &self, + pos: usize, + buffer: Rc>, + c: Rc, + ) -> Result<()> { + let mut file = self.file.borrow_mut(); + file.seek(std::io::SeekFrom::Start(pos as u64))?; + let buf = buffer.borrow(); + let buf = buf.as_slice(); + file.write_all(buf)?; + Ok(()) + } +} diff --git a/core/io/mod.rs b/core/io/mod.rs index de34a70cb..549ded5b0 100644 --- a/core/io/mod.rs +++ b/core/io/mod.rs @@ -128,4 +128,9 @@ cfg_block! { mod windows; pub use windows::WindowsIO as PlatformIO; } + + #[cfg(not(any(target_os = "linux", target_os = "macos", target_os = "windows")))] { + mod generic; + pub use generic::GenericIO as PlatformIO; + } }