summaryrefslogtreecommitdiff
path: root/runtime/js
diff options
context:
space:
mode:
authorSatya Rohith <me@satyarohith.com>2024-03-13 22:52:25 +0530
committerGitHub <noreply@github.com>2024-03-13 17:22:25 +0000
commit0fd8f549e2194223eca2d4b17f4e96cd5a0f5fd5 (patch)
tree76181b2a5f2991134f7343cfc6d4b8b755dbc333 /runtime/js
parentb3ca3b2f25931afb350027bde87dc3d4f9a741b0 (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.js15
-rw-r--r--runtime/js/99_main.js13
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