diff options
author | Satya Rohith <me@satyarohith.com> | 2024-03-13 22:52:25 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-13 17:22:25 +0000 |
commit | 0fd8f549e2194223eca2d4b17f4e96cd5a0f5fd5 (patch) | |
tree | 76181b2a5f2991134f7343cfc6d4b8b755dbc333 /runtime/js | |
parent | b3ca3b2f25931afb350027bde87dc3d4f9a741b0 (diff) |
fix(ext/node): allow automatic worker_thread termination (#22647)
Co-authored-by: Matt Mastracci <matthew@mastracci.com>
Diffstat (limited to 'runtime/js')
-rw-r--r-- | runtime/js/11_workers.js | 15 | ||||
-rw-r--r-- | runtime/js/99_main.js | 13 |
2 files changed, 17 insertions, 11 deletions
diff --git a/runtime/js/11_workers.js b/runtime/js/11_workers.js index 15bbad101..5d24df93d 100644 --- a/runtime/js/11_workers.js +++ b/runtime/js/11_workers.js @@ -46,6 +46,7 @@ function createWorker( permissions, name, workerType, + closeOnIdle, ) { return op_create_worker({ hasSourceCode, @@ -54,6 +55,7 @@ function createWorker( sourceCode, specifier, workerType, + closeOnIdle, }); } @@ -75,14 +77,6 @@ function hostRecvMessage(id) { const privateWorkerRef = Symbol(); -function refWorker(worker) { - worker[privateWorkerRef](true); -} - -function unrefWorker(worker) { - worker[privateWorkerRef](false); -} - class Worker extends EventTarget { #id = 0; #name = ""; @@ -134,8 +128,9 @@ class Worker extends EventTarget { hasSourceCode, sourceCode, deno?.permissions, - name, + this.#name, workerType, + false, ); this.#id = id; this.#pollControl(); @@ -325,4 +320,4 @@ webidl.converters["WorkerType"] = webidl.createEnumConverter("WorkerType", [ "module", ]); -export { refWorker, unrefWorker, Worker }; +export { Worker }; diff --git a/runtime/js/99_main.js b/runtime/js/99_main.js index 27ba488e7..585128ba8 100644 --- a/runtime/js/99_main.js +++ b/runtime/js/99_main.js @@ -279,6 +279,7 @@ function postMessage(message, transferOrOptions = {}) { let isClosing = false; let globalDispatchEvent; +let closeOnIdle; async function pollForMessages() { if (!globalDispatchEvent) { @@ -288,7 +289,14 @@ async function pollForMessages() { ); } while (!isClosing) { - const data = await op_worker_recv_message(); + const op = op_worker_recv_message(); + // In a Node.js worker, unref() the op promise to prevent it from + // keeping the event loop alive. This avoids the need to explicitly + // call self.close() or worker.terminate(). + if (closeOnIdle) { + core.unrefOpPromise(op); + } + const data = await op; if (data === null) break; const v = messagePort.deserializeJsMessageData(data); const message = v[0]; @@ -803,6 +811,8 @@ function bootstrapWorkerRuntime( 6: argv0, 7: shouldDisableDeprecatedApiWarning, 8: shouldUseVerboseDeprecatedApiWarning, + 9: _future, + 10: closeOnIdle_, } = runtimeOptions; deprecatedApiWarningDisabled = shouldDisableDeprecatedApiWarning; @@ -864,6 +874,7 @@ function bootstrapWorkerRuntime( location.setLocationHref(location_); + closeOnIdle = closeOnIdle_; globalThis.pollForMessages = pollForMessages; // TODO(bartlomieju): deprecate --unstable |