summaryrefslogtreecommitdiff
path: root/runtime/ops
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2022-06-08 17:45:38 +0200
committerGitHub <noreply@github.com>2022-06-08 17:45:38 +0200
commitba13b8e2a9efff13e4a7c0659bb2ed184cc4e683 (patch)
tree787dfd5f56557cfb6f25008924118ef0c53e1ab7 /runtime/ops
parent4911acb148a4b7b22a205772e2e9c410ee5be9c7 (diff)
refactor: ensure exit code reference is passed to all workers (#14814)
Diffstat (limited to 'runtime/ops')
-rw-r--r--runtime/ops/os.rs13
-rw-r--r--runtime/ops/worker_host.rs12
2 files changed, 9 insertions, 16 deletions
diff --git a/runtime/ops/os.rs b/runtime/ops/os.rs
index 37da410ca..f138bae31 100644
--- a/runtime/ops/os.rs
+++ b/runtime/ops/os.rs
@@ -2,6 +2,7 @@
use super::utils::into_string;
use crate::permissions::Permissions;
+use crate::worker::ExitCode;
use deno_core::error::{type_error, AnyError};
use deno_core::op;
use deno_core::url::Url;
@@ -10,11 +11,8 @@ 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(maybe_exit_code: Option<Arc<AtomicI32>>) -> Extension {
+pub fn init(exit_code: ExitCode) -> Extension {
Extension::builder()
.ops(vec![
op_env::decl(),
@@ -33,8 +31,7 @@ pub fn init(maybe_exit_code: Option<Arc<AtomicI32>>) -> Extension {
op_system_memory_info::decl(),
])
.state(move |state| {
- let exit_code = maybe_exit_code.clone().unwrap_or_default();
- state.put::<Arc<AtomicI32>>(exit_code);
+ state.put::<ExitCode>(exit_code.clone());
Ok(())
})
.build()
@@ -105,12 +102,12 @@ fn op_delete_env(state: &mut OpState, key: String) -> Result<(), AnyError> {
#[op]
fn op_set_exit_code(state: &mut OpState, code: i32) {
- state.borrow_mut::<Arc<AtomicI32>>().store(code, Relaxed);
+ state.borrow_mut::<ExitCode>().set(code);
}
#[op]
fn op_exit(state: &mut OpState) {
- let code = state.borrow::<Arc<AtomicI32>>().load(Relaxed);
+ let code = state.borrow::<ExitCode>().get();
std::process::exit(code)
}
diff --git a/runtime/ops/worker_host.rs b/runtime/ops/worker_host.rs
index d869e5871..9860f7cb5 100644
--- a/runtime/ops/worker_host.rs
+++ b/runtime/ops/worker_host.rs
@@ -11,6 +11,7 @@ use crate::web_worker::WebWorkerHandle;
use crate::web_worker::WebWorkerType;
use crate::web_worker::WorkerControlEvent;
use crate::web_worker::WorkerId;
+use crate::worker::ExitCode;
use crate::worker::FormatJsErrorFn;
use deno_core::error::AnyError;
use deno_core::futures::future::LocalFutureObj;
@@ -27,7 +28,6 @@ use log::debug;
use std::cell::RefCell;
use std::collections::HashMap;
use std::rc::Rc;
-use std::sync::atomic::AtomicI32;
use std::sync::Arc;
pub struct CreateWebWorkerArgs {
@@ -37,7 +37,7 @@ pub struct CreateWebWorkerArgs {
pub permissions: Permissions,
pub main_module: ModuleSpecifier,
pub worker_type: WebWorkerType,
- pub maybe_exit_code: Option<Arc<AtomicI32>>,
+ pub exit_code: ExitCode,
}
pub type CreateWebWorkerCb = dyn Fn(CreateWebWorkerArgs) -> (WebWorker, SendableWebWorkerHandle)
@@ -171,11 +171,7 @@ fn op_create_worker(
parent_permissions.clone()
};
let parent_permissions = parent_permissions.clone();
- // `try_borrow` here, because worker might have been started without
- // access to `Deno` namespace.
- // TODO(bartlomieju): can a situation happen when parent doesn't
- // have access to `exit_code` but the child does?
- let maybe_exit_code = state.try_borrow::<Arc<AtomicI32>>().cloned();
+ let exit_code = state.borrow::<ExitCode>().clone();
let worker_id = state.take::<WorkerId>();
let create_web_worker_cb = state.take::<CreateWebWorkerCbHolder>();
state.put::<CreateWebWorkerCbHolder>(create_web_worker_cb.clone());
@@ -211,7 +207,7 @@ fn op_create_worker(
permissions: worker_permissions,
main_module: module_specifier.clone(),
worker_type,
- maybe_exit_code,
+ exit_code,
});
// Send thread safe handle from newly created worker to host thread