diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2021-12-11 15:56:45 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-11 15:56:45 +0100 |
commit | 0dec9b4381e0aa1d4b75ab5837cb75598f19c727 (patch) | |
tree | 960f9bd48c5b733317c5592d9843f315883413f8 /runtime/worker.rs | |
parent | 13d7d5722771bf8c4de7083dc0f964dfffcb318a (diff) |
fix: op_set_exit_code (#13034)
Fixes "op_set_exit_code" by sharing a single "Arc" between
all workers (via "op state") instead of having a "global" value stored in
"deno_runtime" crate. As a consequence setting an exit code is always
scoped to a tree of workers, instead of being overridable if there are
multiple worker tree (like in "deno test --jobs" subcommand).
Refactored "cli/main.rs" functions to return "Result<i32, AnyError>" instead
of "Result<(), AnyError>" so they can return exit code.
Diffstat (limited to 'runtime/worker.rs')
-rw-r--r-- | runtime/worker.rs | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/runtime/worker.rs b/runtime/worker.rs index 3a16b7b55..545128dff 100644 --- a/runtime/worker.rs +++ b/runtime/worker.rs @@ -25,6 +25,8 @@ use deno_web::BlobStore; use log::debug; use std::pin::Pin; use std::rc::Rc; +use std::sync::atomic::AtomicI32; +use std::sync::atomic::Ordering::Relaxed; use std::sync::Arc; use std::task::Context; use std::task::Poll; @@ -135,7 +137,7 @@ impl MainWorker { unstable, options.unsafely_ignore_certificate_errors.clone(), ), - ops::os::init(), + ops::os::init(None), ops::permissions::init(), ops::process::init(), ops::signal::init(), @@ -289,6 +291,15 @@ impl MainWorker { }; } } + + /// Return exit code set by the executed code (either in main worker + /// or one of child web workers). + pub fn get_exit_code(&mut self) -> i32 { + let op_state_rc = self.js_runtime.op_state(); + let op_state = op_state_rc.borrow(); + let exit_code = op_state.borrow::<Arc<AtomicI32>>().load(Relaxed); + exit_code + } } #[cfg(test)] |