diff options
author | Yoshiya Hinosawa <stibium121@gmail.com> | 2021-06-25 13:15:35 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-25 13:15:35 +0900 |
commit | 606611708c4351e9f5e0e3b975f9331d95168efb (patch) | |
tree | 38cf330854d59d9bb48d51c9edf2ae982cfe6804 /core/ops_json.rs | |
parent | 66c5f41c5bd5fa08daa09f8650135000c1787829 (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.rs | 34 |
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::*; |