From 2612b6f20fc21fb92402aa9086d13a7192ae3814 Mon Sep 17 00:00:00 2001 From: Divy Srivastava Date: Wed, 20 Apr 2022 22:09:13 +0530 Subject: core: introduce `resource.read_return` (#14331) --- runtime/ops/io.rs | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) (limited to 'runtime') 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, mut buf: ZeroCopyBuf, - ) -> Result { + ) -> 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, buf: ZeroCopyBuf) -> AsyncResult { + fn read_return( + self: Rc, + buf: ZeroCopyBuf, + ) -> AsyncResult<(usize, ZeroCopyBuf)> { Box::pin(self.read(buf)) } @@ -219,7 +222,10 @@ impl Resource for ChildStderrResource { "childStderr".into() } - fn read(self: Rc, buf: ZeroCopyBuf) -> AsyncResult { + fn read_return( + self: Rc, + buf: ZeroCopyBuf, + ) -> AsyncResult<(usize, ZeroCopyBuf)> { Box::pin(self.read(buf)) } @@ -263,16 +269,17 @@ impl StdFileResource { async fn read( self: Rc, mut buf: ZeroCopyBuf, - ) -> Result { + ) -> 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, buf: ZeroCopyBuf) -> AsyncResult { + fn read_return( + self: Rc, + buf: ZeroCopyBuf, + ) -> AsyncResult<(usize, ZeroCopyBuf)> { Box::pin(self.read(buf)) } -- cgit v1.2.3