summaryrefslogtreecommitdiff
path: root/runtime/ops/io.rs
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/ops/io.rs')
-rw-r--r--runtime/ops/io.rs32
1 files changed, 21 insertions, 11 deletions
diff --git a/runtime/ops/io.rs b/runtime/ops/io.rs
index 6db5d69a9..b8449af86 100644
--- a/runtime/ops/io.rs
+++ b/runtime/ops/io.rs
@@ -170,13 +170,13 @@ where
async fn read(
self: Rc<Self>,
mut buf: ZeroCopyBuf,
- ) -> Result<usize, AnyError> {
+ ) -> Result<(usize, ZeroCopyBuf), AnyError> {
let mut rd = self.borrow_mut().await;
let nread = rd
.read(&mut buf)
.try_or_cancel(self.cancel_handle())
.await?;
- Ok(nread)
+ Ok((nread, buf))
}
}
@@ -203,7 +203,10 @@ impl Resource for ChildStdoutResource {
"childStdout".into()
}
- fn read(self: Rc<Self>, buf: ZeroCopyBuf) -> AsyncResult<usize> {
+ fn read_return(
+ self: Rc<Self>,
+ buf: ZeroCopyBuf,
+ ) -> AsyncResult<(usize, ZeroCopyBuf)> {
Box::pin(self.read(buf))
}
@@ -219,7 +222,10 @@ impl Resource for ChildStderrResource {
"childStderr".into()
}
- fn read(self: Rc<Self>, buf: ZeroCopyBuf) -> AsyncResult<usize> {
+ fn read_return(
+ self: Rc<Self>,
+ buf: ZeroCopyBuf,
+ ) -> AsyncResult<(usize, ZeroCopyBuf)> {
Box::pin(self.read(buf))
}
@@ -263,16 +269,17 @@ impl StdFileResource {
async fn read(
self: Rc<Self>,
mut buf: ZeroCopyBuf,
- ) -> Result<usize, AnyError> {
+ ) -> Result<(usize, ZeroCopyBuf), AnyError> {
if self.fs_file.is_some() {
let fs_file = self.fs_file.as_ref().unwrap();
let std_file = fs_file.0.as_ref().unwrap().clone();
- tokio::task::spawn_blocking(move || {
- let mut std_file = std_file.lock().unwrap();
- std_file.read(&mut buf)
- })
+ tokio::task::spawn_blocking(
+ move || -> Result<(usize, ZeroCopyBuf), AnyError> {
+ let mut std_file = std_file.lock().unwrap();
+ Ok((std_file.read(&mut buf)?, buf))
+ },
+ )
.await?
- .map_err(AnyError::from)
} else {
Err(resource_unavailable())
}
@@ -322,7 +329,10 @@ impl Resource for StdFileResource {
self.name.as_str().into()
}
- fn read(self: Rc<Self>, buf: ZeroCopyBuf) -> AsyncResult<usize> {
+ fn read_return(
+ self: Rc<Self>,
+ buf: ZeroCopyBuf,
+ ) -> AsyncResult<(usize, ZeroCopyBuf)> {
Box::pin(self.read(buf))
}