summaryrefslogtreecommitdiff
path: root/core/ops_json.rs
diff options
context:
space:
mode:
authorYoshiya Hinosawa <stibium121@gmail.com>2021-06-25 13:15:35 +0900
committerGitHub <noreply@github.com>2021-06-25 13:15:35 +0900
commit606611708c4351e9f5e0e3b975f9331d95168efb (patch)
tree38cf330854d59d9bb48d51c9edf2ae982cfe6804 /core/ops_json.rs
parent66c5f41c5bd5fa08daa09f8650135000c1787829 (diff)
fix(runtime/signal): use op_async_unref for op_signal_poll (#11097)
Diffstat (limited to 'core/ops_json.rs')
-rw-r--r--core/ops_json.rs34
1 files changed, 34 insertions, 0 deletions
diff --git a/core/ops_json.rs b/core/ops_json.rs
index 07208a420..25752322a 100644
--- a/core/ops_json.rs
+++ b/core/ops_json.rs
@@ -51,6 +51,9 @@ where
/// Creates an op that passes data asynchronously using JSON.
///
+/// When this op is dispatched, the runtime doesn't exit while processing it.
+/// Use op_async_unref instead if you want to make the runtime exit while processing it.
+///
/// The provided function `op_fn` has the following parameters:
/// * `Rc<RefCell<OpState>`: the op state, can be used to read/write resources in the runtime from an op.
/// * `V`: the deserializable value that is passed to the Rust function.
@@ -99,6 +102,37 @@ where
})
}
+/// Creates an op that passes data asynchronously using JSON.
+///
+/// When this op is dispatched, the runtime still can exit while processing it.
+///
+/// The other usages are the same as `op_async`.
+pub fn op_async_unref<F, A, B, R, RV>(op_fn: F) -> Box<OpFn>
+where
+ F: Fn(Rc<RefCell<OpState>>, A, B) -> R + 'static,
+ A: DeserializeOwned,
+ B: DeserializeOwned,
+ R: Future<Output = Result<RV, AnyError>> + 'static,
+ RV: Serialize + 'static,
+{
+ Box::new(move |state, payload| -> Op {
+ let pid = payload.promise_id;
+ // Deserialize args, sync error on failure
+ let args = match payload.deserialize() {
+ Ok(args) => args,
+ Err(err) => {
+ return Op::Sync(serialize_op_result(Err::<(), AnyError>(err), state))
+ }
+ };
+ let (a, b) = args;
+
+ use crate::futures::FutureExt;
+ let fut = op_fn(state.clone(), a, b)
+ .map(move |result| (pid, serialize_op_result(result, state)));
+ Op::AsyncUnref(Box::pin(fut))
+ })
+}
+
#[cfg(test)]
mod tests {
use super::*;