diff options
Diffstat (limited to 'runtime/ops/os.rs')
-rw-r--r-- | runtime/ops/os.rs | 21 |
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) } |