summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/ops_builtin.rs21
-rw-r--r--core/resources.rs4
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 {