diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/ops_builtin.rs | 21 | ||||
-rw-r--r-- | core/resources.rs | 4 |
2 files changed, 25 insertions, 0 deletions
diff --git a/core/ops_builtin.rs b/core/ops_builtin.rs index 6ca2a132c..7393d4b69 100644 --- a/core/ops_builtin.rs +++ b/core/ops_builtin.rs @@ -34,6 +34,7 @@ pub(crate) fn init_builtins() -> Extension { op_add::decl(), // // TODO(@AaronO): track IO metrics for builtin streams op_read::decl(), + op_read_all::decl(), op_write::decl(), op_shutdown::decl(), op_metrics::decl(), @@ -169,6 +170,26 @@ async fn op_read( } #[op] +async fn op_read_all( + state: Rc<RefCell<OpState>>, + rid: ResourceId, +) -> Result<ZeroCopyBuf, Error> { + let resource = state.borrow().resource_table.get_any(rid)?; + let (min, maximum) = resource.size_hint(); + let size = maximum.unwrap_or(min) as usize; + + let mut buffer = Vec::with_capacity(size); + loop { + let tmp = ZeroCopyBuf::new_temp(vec![0u8; 64 * 1024]); + let (nread, tmp) = resource.clone().read_return(tmp).await?; + if nread == 0 { + return Ok(buffer.into()); + } + buffer.extend_from_slice(&tmp[..nread]); + } +} + +#[op] async fn op_write( state: Rc<RefCell<OpState>>, rid: ResourceId, diff --git a/core/resources.rs b/core/resources.rs index 56c9298af..1a1ba3193 100644 --- a/core/resources.rs +++ b/core/resources.rs @@ -64,6 +64,10 @@ pub trait Resource: Any + 'static { fn backing_fd(self: Rc<Self>) -> Option<std::os::unix::prelude::RawFd> { None } + + fn size_hint(&self) -> (u64, Option<u64>) { + (0, None) + } } impl dyn Resource { |