From bbc211906dcd5043af549250343cd7b42fb45043 Mon Sep 17 00:00:00 2001 From: Satya Rohith Date: Thu, 14 Mar 2024 01:22:53 +0530 Subject: fix(ext/node): make worker ids sequential (#22884) --- runtime/js/99_main.js | 2 ++ runtime/ops/worker_host.rs | 4 +--- runtime/web_worker.rs | 35 ++++++++++++++++++++++------------- 3 files changed, 25 insertions(+), 16 deletions(-) (limited to 'runtime') diff --git a/runtime/js/99_main.js b/runtime/js/99_main.js index 585128ba8..62e7278ff 100644 --- a/runtime/js/99_main.js +++ b/runtime/js/99_main.js @@ -794,6 +794,7 @@ function bootstrapWorkerRuntime( runtimeOptions, name, internalName, + workerId, maybeWorkerMetadata, ) { if (hasBootstrapped) { @@ -929,6 +930,7 @@ function bootstrapWorkerRuntime( hasNodeModulesDir, argv0, /* runningOnMainThread */ false, + workerId, workerMetadata, ); } diff --git a/runtime/ops/worker_host.rs b/runtime/ops/worker_host.rs index 3cfad5abb..242d3bcda 100644 --- a/runtime/ops/worker_host.rs +++ b/runtime/ops/worker_host.rs @@ -95,7 +95,6 @@ deno_core::extension!( }, state = |state, options| { state.put::(WorkersTable::default()); - state.put::(WorkerId::default()); let create_web_worker_cb_holder = CreateWebWorkerCbHolder(options.create_web_worker_cb); @@ -163,10 +162,9 @@ fn op_create_worker( parent_permissions.clone() }; let parent_permissions = parent_permissions.clone(); - let worker_id = state.take::(); let create_web_worker_cb = state.borrow::().clone(); let format_js_error_fn = state.borrow::().clone(); - state.put::(worker_id.next().unwrap()); + let worker_id = WorkerId::new(); let module_specifier = deno_core::resolve_url(&specifier)?; let worker_name = args_name.unwrap_or_default(); diff --git a/runtime/web_worker.rs b/runtime/web_worker.rs index 82da9de9e..31930be39 100644 --- a/runtime/web_worker.rs +++ b/runtime/web_worker.rs @@ -55,33 +55,40 @@ use std::cell::RefCell; use std::fmt; use std::rc::Rc; use std::sync::atomic::AtomicBool; +use std::sync::atomic::AtomicU32; use std::sync::atomic::Ordering; use std::sync::Arc; use std::task::Context; use std::task::Poll; -#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)] -#[serde(rename_all = "lowercase")] -pub enum WebWorkerType { - Classic, - Module, -} +static WORKER_ID_COUNTER: AtomicU32 = AtomicU32::new(1); -#[derive( - Debug, Default, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, -)] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct WorkerId(u32); +impl WorkerId { + pub fn new() -> WorkerId { + let id = WORKER_ID_COUNTER.fetch_add(1, Ordering::SeqCst); + WorkerId(id) + } +} impl fmt::Display for WorkerId { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "worker-{}", self.0) } } -impl WorkerId { - pub fn next(&self) -> Option { - self.0.checked_add(1).map(WorkerId) +impl Default for WorkerId { + fn default() -> Self { + Self::new() } } +#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum WebWorkerType { + Classic, + Module, +} + /// Events that are sent to host from child /// worker. pub enum WorkerControlEvent { @@ -630,11 +637,13 @@ impl WebWorker { v8::String::new(scope, &format!("{}", self.id)) .unwrap() .into(); + let id: v8::Local = + v8::Integer::new(scope, self.id.0 as i32).into(); bootstrap_fn .call( scope, undefined.into(), - &[args, name_str, id_str, worker_data], + &[args, name_str, id_str, id, worker_data], ) .unwrap(); } -- cgit v1.2.3