wasi-common: break dep on system-interface by defining our own Advice enum

This commit is contained in:
Pat Hickey
2021-01-29 17:03:08 -08:00
parent 2e10e621c4
commit 95ad13c82d
8 changed files with 47 additions and 25 deletions

10
Cargo.lock generated
View File

@@ -3093,7 +3093,6 @@ dependencies = [
"cap-rand", "cap-rand",
"cap-std", "cap-std",
"libc", "libc",
"system-interface",
"thiserror", "thiserror",
"tracing", "tracing",
"wiggle", "wiggle",
@@ -3129,6 +3128,15 @@ dependencies = [
"zeroize", "zeroize",
] ]
[[package]]
name = "wasi-virtfs"
version = "0.22.0"
dependencies = [
"anyhow",
"cap-std",
"wasi-common",
]
[[package]] [[package]]
name = "wasm-encoder" name = "wasm-encoder"
version = "0.4.0" version = "0.4.0"

View File

@@ -77,6 +77,7 @@ members = [
"crates/wiggle/wasmtime", "crates/wiggle/wasmtime",
"crates/wasi-common", "crates/wasi-common",
"crates/wasi-common/cap-std-sync", "crates/wasi-common/cap-std-sync",
"crates/wasi-common/virtfs",
"examples/fib-debug/wasm", "examples/fib-debug/wasm",
"examples/wasi/wasm", "examples/wasi/wasm",
"examples/wasi-fs/wasm", "examples/wasi-fs/wasm",

View File

@@ -23,7 +23,6 @@ anyhow = "1.0"
thiserror = "1.0" thiserror = "1.0"
wiggle = { path = "../wiggle", default-features = false, version = "0.22.0" } wiggle = { path = "../wiggle", default-features = false, version = "0.22.0" }
tracing = "0.1.19" tracing = "0.1.19"
system-interface = { version = "0.5.4", features = ["cap_std_impls"] }
cap-std = "0.12" cap-std = "0.12"
cap-rand = "0.12" cap-rand = "0.12"
bitflags = "1.2" bitflags = "1.2"

View File

@@ -4,11 +4,11 @@ use std::any::Any;
use std::convert::TryInto; use std::convert::TryInto;
use std::io; use std::io;
use system_interface::{ use system_interface::{
fs::{Advice, FileIoExt, GetSetFdFlags}, fs::{FileIoExt, GetSetFdFlags},
io::ReadReady, io::ReadReady,
}; };
use wasi_common::{ use wasi_common::{
file::{FdFlags, FileType, Filestat, WasiFile}, file::{Advice, FdFlags, FileType, Filestat, WasiFile},
Error, Error,
}; };
@@ -61,7 +61,7 @@ impl WasiFile for File {
Ok(()) Ok(())
} }
fn advise(&self, offset: u64, len: u64, advice: Advice) -> Result<(), Error> { fn advise(&self, offset: u64, len: u64, advice: Advice) -> Result<(), Error> {
self.0.advise(offset, len, advice)?; self.0.advise(offset, len, convert_advice(advice))?;
Ok(()) Ok(())
} }
fn allocate(&self, offset: u64, len: u64) -> Result<(), Error> { fn allocate(&self, offset: u64, len: u64) -> Result<(), Error> {
@@ -193,3 +193,13 @@ pub fn from_sysif_fdflags(f: system_interface::fs::FdFlags) -> wasi_common::file
} }
out out
} }
pub fn convert_advice(advice: Advice) -> system_interface::fs::Advice {
match advice {
Advice::Normal => system_interface::fs::Advice::Normal,
Advice::Sequential => system_interface::fs::Advice::Sequential,
Advice::Random => system_interface::fs::Advice::Random,
Advice::WillNeed => system_interface::fs::Advice::WillNeed,
Advice::DontNeed => system_interface::fs::Advice::DontNeed,
Advice::NoReuse => system_interface::fs::Advice::NoReuse,
}
}

View File

@@ -4,7 +4,7 @@ use std::any::Any;
use std::convert::TryInto; use std::convert::TryInto;
use std::io; use std::io;
use std::io::{Read, Write}; use std::io::{Read, Write};
use system_interface::{fs::Advice, io::ReadReady}; use system_interface::io::ReadReady;
#[cfg(unix)] #[cfg(unix)]
use std::os::unix::io::{AsRawFd, RawFd}; use std::os::unix::io::{AsRawFd, RawFd};
@@ -12,7 +12,7 @@ use std::os::unix::io::{AsRawFd, RawFd};
use std::os::windows::io::{AsRawHandle, RawHandle}; use std::os::windows::io::{AsRawHandle, RawHandle};
use unsafe_io::AsUnsafeFile; use unsafe_io::AsUnsafeFile;
use wasi_common::{ use wasi_common::{
file::{FdFlags, FileType, Filestat, WasiFile}, file::{Advice, FdFlags, FileType, Filestat, WasiFile},
Error, ErrorExt, Error, ErrorExt,
}; };

View File

@@ -13,12 +13,7 @@ pub trait WasiFile {
fn set_fdflags(&mut self, flags: FdFlags) -> Result<(), Error>; // file op fn set_fdflags(&mut self, flags: FdFlags) -> Result<(), Error>; // file op
fn get_filestat(&self) -> Result<Filestat, Error>; // split out get_length as a read & write op, rest is a file op fn get_filestat(&self) -> Result<Filestat, Error>; // split out get_length as a read & write op, rest is a file op
fn set_filestat_size(&self, _size: u64) -> Result<(), Error>; // write op fn set_filestat_size(&self, _size: u64) -> Result<(), Error>; // write op
fn advise( fn advise(&self, offset: u64, len: u64, advice: Advice) -> Result<(), Error>; // file op
&self,
offset: u64,
len: u64,
advice: system_interface::fs::Advice,
) -> Result<(), Error>; // file op
fn allocate(&self, offset: u64, len: u64) -> Result<(), Error>; // write op fn allocate(&self, offset: u64, len: u64) -> Result<(), Error>; // write op
fn set_times( fn set_times(
&self, &self,
@@ -170,3 +165,13 @@ pub struct FdStat {
pub caps: FileCaps, pub caps: FileCaps,
pub flags: FdFlags, pub flags: FdFlags,
} }
#[derive(Debug, Clone)]
pub enum Advice {
Normal,
Sequential,
Random,
WillNeed,
DontNeed,
NoReuse,
}

View File

@@ -10,14 +10,13 @@
//! but the virtual pipes can be instantiated with any `Read` or `Write` type. //! but the virtual pipes can be instantiated with any `Read` or `Write` type.
//! //!
use crate::{ use crate::{
file::{FdFlags, FileType, Filestat, WasiFile}, file::{Advice, FdFlags, FileType, Filestat, WasiFile},
Error, ErrorExt, SystemTimeSpec, Error, ErrorExt, SystemTimeSpec,
}; };
use std::any::Any; use std::any::Any;
use std::convert::TryInto; use std::convert::TryInto;
use std::io::{self, Read, Write}; use std::io::{self, Read, Write};
use std::sync::{Arc, RwLock}; use std::sync::{Arc, RwLock};
use system_interface::fs::Advice;
/// A virtual pipe read end. /// A virtual pipe read end.
/// ///

View File

@@ -1,8 +1,8 @@
use crate::{ use crate::{
dir::{DirCaps, DirEntry, DirEntryExt, DirFdStat, ReaddirCursor, ReaddirEntity, TableDirExt}, dir::{DirCaps, DirEntry, DirEntryExt, DirFdStat, ReaddirCursor, ReaddirEntity, TableDirExt},
file::{ file::{
FdFlags, FdStat, FileCaps, FileEntry, FileEntryExt, FileEntryMutExt, FileType, Filestat, Advice, FdFlags, FdStat, FileCaps, FileEntry, FileEntryExt, FileEntryMutExt, FileType,
OFlags, TableFileExt, Filestat, OFlags, TableFileExt,
}, },
sched::{ sched::{
subscription::{RwEventFlags, SubscriptionResult}, subscription::{RwEventFlags, SubscriptionResult},
@@ -1081,15 +1081,15 @@ impl<'a> wasi_snapshot_preview1::WasiSnapshotPreview1 for WasiCtx {
} }
} }
impl From<types::Advice> for system_interface::fs::Advice { impl From<types::Advice> for Advice {
fn from(advice: types::Advice) -> system_interface::fs::Advice { fn from(advice: types::Advice) -> Advice {
match advice { match advice {
types::Advice::Normal => system_interface::fs::Advice::Normal, types::Advice::Normal => Advice::Normal,
types::Advice::Sequential => system_interface::fs::Advice::Sequential, types::Advice::Sequential => Advice::Sequential,
types::Advice::Random => system_interface::fs::Advice::Random, types::Advice::Random => Advice::Random,
types::Advice::Willneed => system_interface::fs::Advice::WillNeed, types::Advice::Willneed => Advice::WillNeed,
types::Advice::Dontneed => system_interface::fs::Advice::DontNeed, types::Advice::Dontneed => Advice::DontNeed,
types::Advice::Noreuse => system_interface::fs::Advice::NoReuse, types::Advice::Noreuse => Advice::NoReuse,
} }
} }
} }