summaryrefslogtreecommitdiff
path: root/runtime/worker.rs
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2021-12-11 15:56:45 +0100
committerGitHub <noreply@github.com>2021-12-11 15:56:45 +0100
commit0dec9b4381e0aa1d4b75ab5837cb75598f19c727 (patch)
tree960f9bd48c5b733317c5592d9843f315883413f8 /runtime/worker.rs
parent13d7d5722771bf8c4de7083dc0f964dfffcb318a (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.rs13
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)]