From fc3a966a2d0be8fc76c384603bf18b55e0bbcf14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Mon, 13 Jun 2022 23:53:04 +0200 Subject: Deno.exit() is an alias to self.close() in worker contexts (#14826) This commit changes Deno.exit() to be an alias to self.close() in worker contexts, and the provided exit code becomes is ignored. --- runtime/ops/os.rs | 56 +++++++++++++++++++++++++++++++--------------- runtime/ops/worker_host.rs | 4 ---- 2 files changed, 38 insertions(+), 22 deletions(-) (limited to 'runtime/ops') diff --git a/runtime/ops/os.rs b/runtime/ops/os.rs index f138bae31..654bbede1 100644 --- a/runtime/ops/os.rs +++ b/runtime/ops/os.rs @@ -4,32 +4,36 @@ 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; use deno_core::Extension; use deno_core::OpState; +use deno_core::{op, ExtensionBuilder}; use serde::Serialize; use std::collections::HashMap; use std::env; +fn init_ops(builder: &mut ExtensionBuilder) -> &mut ExtensionBuilder { + builder.ops(vec![ + op_env::decl(), + op_exec_path::decl(), + op_exit::decl(), + op_delete_env::decl(), + op_get_env::decl(), + op_getgid::decl(), + op_getuid::decl(), + op_hostname::decl(), + op_loadavg::decl(), + op_network_interfaces::decl(), + op_os_release::decl(), + op_set_env::decl(), + op_set_exit_code::decl(), + op_system_memory_info::decl(), + ]) +} + pub fn init(exit_code: ExitCode) -> Extension { - Extension::builder() - .ops(vec![ - op_env::decl(), - op_exec_path::decl(), - op_exit::decl(), - op_delete_env::decl(), - op_get_env::decl(), - op_getgid::decl(), - op_getuid::decl(), - op_hostname::decl(), - op_loadavg::decl(), - op_network_interfaces::decl(), - op_os_release::decl(), - op_set_env::decl(), - op_set_exit_code::decl(), - op_system_memory_info::decl(), - ]) + let mut builder = Extension::builder(); + init_ops(&mut builder) .state(move |state| { state.put::(exit_code.clone()); Ok(()) @@ -37,6 +41,22 @@ pub fn init(exit_code: ExitCode) -> Extension { .build() } +pub fn init_for_worker() -> Extension { + let mut builder = Extension::builder(); + init_ops(&mut builder) + .middleware(|op| match op.name { + "op_exit" => noop_op::decl(), + "op_set_exit_code" => noop_op::decl(), + _ => op, + }) + .build() +} + +#[op] +fn noop_op(_code: i32) -> Result<(), AnyError> { + Ok(()) +} + #[op] fn op_exec_path(state: &mut OpState) -> Result { let current_exe = env::current_exe().unwrap(); diff --git a/runtime/ops/worker_host.rs b/runtime/ops/worker_host.rs index 9860f7cb5..b61fca460 100644 --- a/runtime/ops/worker_host.rs +++ b/runtime/ops/worker_host.rs @@ -11,7 +11,6 @@ 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; @@ -37,7 +36,6 @@ pub struct CreateWebWorkerArgs { pub permissions: Permissions, pub main_module: ModuleSpecifier, pub worker_type: WebWorkerType, - pub exit_code: ExitCode, } pub type CreateWebWorkerCb = dyn Fn(CreateWebWorkerArgs) -> (WebWorker, SendableWebWorkerHandle) @@ -171,7 +169,6 @@ fn op_create_worker( parent_permissions.clone() }; let parent_permissions = parent_permissions.clone(); - let exit_code = state.borrow::().clone(); let worker_id = state.take::(); let create_web_worker_cb = state.take::(); state.put::(create_web_worker_cb.clone()); @@ -207,7 +204,6 @@ fn op_create_worker( permissions: worker_permissions, main_module: module_specifier.clone(), worker_type, - exit_code, }); // Send thread safe handle from newly created worker to host thread -- cgit v1.2.3