Skip to content

Commit cd1398b

Browse files
committed
Pipe together wasmtime subprocesses instead of managing the buffer
1 parent 4c640cb commit cd1398b

5 files changed

Lines changed: 103 additions & 325 deletions

File tree

crates/wasi/src/preview2/stdio.rs

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,6 @@ pub trait StdinStream: Send + Sync {
3636
fn isatty(&self) -> bool;
3737
}
3838

39-
impl<T: StdinStream + ?Sized> StdinStream for Box<T> {
40-
fn stream(&self) -> Box<dyn HostInputStream> {
41-
self.as_ref().stream()
42-
}
43-
44-
fn isatty(&self) -> bool {
45-
self.as_ref().isatty()
46-
}
47-
}
48-
4939
impl StdinStream for pipe::MemoryInputPipe {
5040
fn stream(&self) -> Box<dyn HostInputStream> {
5141
Box::new(self.clone())
@@ -89,16 +79,6 @@ pub trait StdoutStream: Send + Sync {
8979
fn isatty(&self) -> bool;
9080
}
9181

92-
impl<T: StdoutStream + ?Sized> StdoutStream for Box<T> {
93-
fn stream(&self) -> Box<dyn HostOutputStream> {
94-
self.as_ref().stream()
95-
}
96-
97-
fn isatty(&self) -> bool {
98-
self.as_ref().isatty()
99-
}
100-
}
101-
10282
impl StdoutStream for pipe::MemoryOutputPipe {
10383
fn stream(&self) -> Box<dyn HostOutputStream> {
10484
Box::new(self.clone())

crates/wasi/tests/all/main.rs

Lines changed: 30 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use wasmtime::{
77
use wasmtime_wasi::preview2::{
88
pipe::MemoryOutputPipe,
99
preview1::{WasiPreview1Adapter, WasiPreview1View},
10-
DirPerms, FilePerms, StdinStream, StdoutStream, WasiCtx, WasiCtxBuilder, WasiView,
10+
DirPerms, FilePerms, WasiCtx, WasiCtxBuilder, WasiView,
1111
};
1212

1313
struct Ctx {
@@ -48,98 +48,40 @@ fn prepare_workspace(exe_name: &str) -> Result<TempDir> {
4848
Ok(tempdir)
4949
}
5050

51-
struct StoreBuilder {
52-
builder: WasiCtxBuilder,
53-
inherit_stdio: bool,
54-
workspace: TempDir,
55-
stdin: Option<Box<dyn StdinStream>>,
56-
stdout: Option<Box<dyn StdoutStream>>,
57-
stderr: Option<Box<dyn StdoutStream>>,
58-
}
59-
60-
impl StoreBuilder {
61-
fn new(name: &str) -> Result<Self> {
62-
let mut builder = WasiCtxBuilder::new();
63-
64-
builder
65-
.args(&[name, "."])
66-
.inherit_network()
67-
.allow_ip_name_lookup(true);
68-
69-
let workspace = prepare_workspace(name)?;
70-
71-
Ok(Self {
72-
builder,
73-
inherit_stdio: false,
74-
workspace,
75-
stdin: None,
76-
stdout: None,
77-
stderr: None,
78-
})
79-
}
80-
81-
fn stdout(&mut self, stdout: Box<dyn StdoutStream>) -> &mut Self {
82-
self.stdout.replace(stdout);
83-
self
51+
fn store(engine: &Engine, name: &str, inherit_stdio: bool) -> Result<(Store<Ctx>, TempDir)> {
52+
let stdout = MemoryOutputPipe::new(4096);
53+
let stderr = MemoryOutputPipe::new(4096);
54+
let workspace = prepare_workspace(name)?;
55+
56+
// Create our wasi context.
57+
let mut builder = WasiCtxBuilder::new();
58+
if inherit_stdio {
59+
builder.inherit_stdio();
60+
} else {
61+
builder.stdout(stdout.clone()).stderr(stderr.clone());
8462
}
8563

86-
fn stdin(&mut self, stdin: Box<dyn StdinStream>) -> &mut Self {
87-
self.stdin.replace(stdin);
88-
self
64+
builder
65+
.args(&[name, "."])
66+
.inherit_network()
67+
.allow_ip_name_lookup(true);
68+
println!("preopen: {:?}", workspace);
69+
let preopen_dir =
70+
cap_std::fs::Dir::open_ambient_dir(workspace.path(), cap_std::ambient_authority())?;
71+
builder.preopened_dir(preopen_dir, DirPerms::all(), FilePerms::all(), ".");
72+
for (var, val) in test_programs_artifacts::wasi_tests_environment() {
73+
builder.env(var, val);
8974
}
9075

91-
fn build(mut self, engine: &Engine) -> Result<(Store<Ctx>, TempDir)> {
92-
let stdout = MemoryOutputPipe::new(4096);
93-
let stderr = MemoryOutputPipe::new(4096);
94-
95-
// Create our wasi context.
96-
if self.inherit_stdio {
97-
self.builder.inherit_stdio();
98-
} else {
99-
if let Some(stdin) = self.stdin {
100-
self.builder.stdin(stdin);
101-
}
102-
103-
if let Some(stdout) = self.stdout {
104-
self.builder.stdout(stdout);
105-
} else {
106-
self.builder.stdout(stdout.clone());
107-
}
108-
109-
if let Some(stderr) = self.stderr {
110-
self.builder.stderr(stderr);
111-
} else {
112-
self.builder.stderr(stderr.clone());
113-
}
114-
}
115-
116-
println!("preopen: {:?}", self.workspace);
117-
let preopen_dir = cap_std::fs::Dir::open_ambient_dir(
118-
self.workspace.path(),
119-
cap_std::ambient_authority(),
120-
)?;
121-
self.builder
122-
.preopened_dir(preopen_dir, DirPerms::all(), FilePerms::all(), ".");
123-
for (var, val) in test_programs_artifacts::wasi_tests_environment() {
124-
self.builder.env(var, val);
125-
}
126-
127-
let ctx = Ctx {
128-
table: ResourceTable::new(),
129-
wasi: self.builder.build(),
130-
stderr,
131-
stdout,
132-
adapter: WasiPreview1Adapter::new(),
133-
};
134-
135-
Ok((Store::new(&engine, ctx), self.workspace))
136-
}
137-
}
76+
let ctx = Ctx {
77+
table: ResourceTable::new(),
78+
wasi: builder.build(),
79+
stderr,
80+
stdout,
81+
adapter: WasiPreview1Adapter::new(),
82+
};
13883

139-
fn store(engine: &Engine, name: &str, inherit_stdio: bool) -> Result<(Store<Ctx>, TempDir)> {
140-
let mut builder = StoreBuilder::new(name)?;
141-
builder.inherit_stdio = inherit_stdio;
142-
builder.build(engine)
84+
Ok((Store::new(&engine, ctx), workspace))
14385
}
14486

14587
impl Drop for Ctx {
@@ -166,6 +108,5 @@ macro_rules! assert_test_exists {
166108

167109
mod api;
168110
mod async_;
169-
mod piped;
170111
mod preview1;
171112
mod sync;

crates/wasi/tests/all/piped.rs

Lines changed: 0 additions & 216 deletions
This file was deleted.

0 commit comments

Comments
 (0)