diff options
author | Ben Noordhuis <info@bnoordhuis.nl> | 2021-07-30 13:36:43 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-30 13:36:43 +0200 |
commit | c909faf9e6cd2964398da7c0852d0229cdd1a22b (patch) | |
tree | 033eb0e7edf86f120b9d96a8f591586d5b46e203 /core/runtime.rs | |
parent | 2b13bb694532904704c16bec4e8a47c386e681e2 (diff) |
chore(core): use oneshot channel in mod_evaluate() (#11556)
Oneshot is more appropriate because mod_evaluate() only sends a single
value.
It also makes it easier to use it correctly. As an embedder, I wasn't
sure if I'm expected to drain the channel or not.
Diffstat (limited to 'core/runtime.rs')
-rw-r--r-- | core/runtime.rs | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/core/runtime.rs b/core/runtime.rs index fc7a7228c..8476e5729 100644 --- a/core/runtime.rs +++ b/core/runtime.rs @@ -22,7 +22,7 @@ use crate::OpPayload; use crate::OpResult; use crate::OpState; use crate::PromiseId; -use futures::channel::mpsc; +use futures::channel::oneshot; use futures::future::poll_fn; use futures::future::FutureExt; use futures::stream::FuturesUnordered; @@ -96,7 +96,7 @@ struct DynImportModEvaluate { struct ModEvaluate { promise: v8::Global<v8::Promise>, - sender: mpsc::Sender<Result<(), AnyError>>, + sender: oneshot::Sender<Result<(), AnyError>>, } #[derive(Default, Clone)] @@ -978,7 +978,7 @@ impl JsRuntime { pub fn mod_evaluate( &mut self, id: ModuleId, - ) -> mpsc::Receiver<Result<(), AnyError>> { + ) -> oneshot::Receiver<Result<(), AnyError>> { let state_rc = Self::state(self.v8_isolate()); let module_map_rc = Self::module_map(self.v8_isolate()); let scope = &mut self.handle_scope(); @@ -991,7 +991,7 @@ impl JsRuntime { let mut status = module.get_status(); assert_eq!(status, v8::ModuleStatus::Instantiated); - let (sender, receiver) = mpsc::channel(1); + let (sender, receiver) = oneshot::channel(); // IMPORTANT: Top-level-await is enabled, which means that return value // of module evaluation is a promise. @@ -1238,7 +1238,6 @@ impl JsRuntime { let scope = &mut self.handle_scope(); let promise = module_evaluation.promise.get(scope); - let mut sender = module_evaluation.sender.clone(); let promise_state = promise.state(); match promise_state { @@ -1250,7 +1249,7 @@ impl JsRuntime { v8::PromiseState::Fulfilled => { scope.perform_microtask_checkpoint(); // Receiver end might have been already dropped, ignore the result - let _ = sender.try_send(Ok(())); + let _ = module_evaluation.sender.send(Ok(())); } v8::PromiseState::Rejected => { let exception = promise.result(scope); @@ -1259,7 +1258,7 @@ impl JsRuntime { .map_err(|err| attach_handle_to_error(scope, err, exception)) .unwrap_err(); // Receiver end might have been already dropped, ignore the result - let _ = sender.try_send(Err(err1)); + let _ = module_evaluation.sender.send(Err(err1)); } } } @@ -1955,7 +1954,7 @@ pub mod tests { ) .unwrap(); - runtime.mod_evaluate(module_id); + let _ = runtime.mod_evaluate(module_id); futures::executor::block_on(runtime.run_event_loop(false)).unwrap(); let _snapshot = runtime.snapshot(); |