summaryrefslogtreecommitdiff
path: root/runtime/ops/os.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/ops/os.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/ops/os.rs')
-rw-r--r--runtime/ops/os.rs21
1 files changed, 16 insertions, 5 deletions
diff --git a/runtime/ops/os.rs b/runtime/ops/os.rs
index 8e96de75d..81f8a529e 100644
--- a/runtime/ops/os.rs
+++ b/runtime/ops/os.rs
@@ -10,9 +10,11 @@ use deno_core::OpState;
use serde::Serialize;
use std::collections::HashMap;
use std::env;
+use std::sync::atomic::AtomicI32;
use std::sync::atomic::Ordering::Relaxed;
+use std::sync::Arc;
-pub fn init() -> Extension {
+pub fn init(maybe_exit_code: Option<Arc<AtomicI32>>) -> Extension {
Extension::builder()
.ops(vec![
("op_exit", op_sync(op_exit)),
@@ -27,6 +29,11 @@ pub fn init() -> Extension {
("op_set_exit_code", op_sync(op_set_exit_code)),
("op_system_memory_info", op_sync(op_system_memory_info)),
])
+ .state(move |state| {
+ let exit_code = maybe_exit_code.clone().unwrap_or_default();
+ state.put::<Arc<AtomicI32>>(exit_code);
+ Ok(())
+ })
.build()
}
@@ -97,13 +104,17 @@ fn op_delete_env(
Ok(())
}
-fn op_set_exit_code(_: &mut OpState, code: i32, _: ()) -> Result<(), AnyError> {
- crate::EXIT_CODE.store(code, Relaxed);
+fn op_set_exit_code(
+ state: &mut OpState,
+ code: i32,
+ _: (),
+) -> Result<(), AnyError> {
+ state.borrow_mut::<Arc<AtomicI32>>().store(code, Relaxed);
Ok(())
}
-fn op_exit(_: &mut OpState, _: (), _: ()) -> Result<(), AnyError> {
- let code = crate::EXIT_CODE.load(Relaxed);
+fn op_exit(state: &mut OpState, _: (), _: ()) -> Result<(), AnyError> {
+ let code = state.borrow::<Arc<AtomicI32>>().load(Relaxed);
std::process::exit(code)
}