mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 17:34:47 -05:00
fix(workers): silently ignore non-existent worker IDs (#11417)
Fixes #11416
This commit is contained in:
parent
91bbd1a6d5
commit
240545282a
5 changed files with 42 additions and 19 deletions
|
@ -1160,6 +1160,11 @@ itest!(worker_event_handler_test {
|
||||||
output: "worker_event_handler_test.js.out",
|
output: "worker_event_handler_test.js.out",
|
||||||
});
|
});
|
||||||
|
|
||||||
|
itest!(worker_close_race {
|
||||||
|
args: "run --quiet --reload --allow-read worker_close_race.js",
|
||||||
|
output: "worker_close_race.js.out",
|
||||||
|
});
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn no_validate_asm() {
|
fn no_validate_asm() {
|
||||||
let output = util::deno_cmd()
|
let output = util::deno_cmd()
|
||||||
|
|
14
cli/tests/worker_close_race.js
Normal file
14
cli/tests/worker_close_race.js
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
|
||||||
|
|
||||||
|
// https://github.com/denoland/deno/issues/11416
|
||||||
|
// Test for a race condition between a worker's `close()` and the main thread's
|
||||||
|
// `Worker.prototype.terminate()`.
|
||||||
|
|
||||||
|
const worker = new Worker(
|
||||||
|
new URL("./workers/close_race_worker.js", import.meta.url),
|
||||||
|
{ type: "module" },
|
||||||
|
);
|
||||||
|
|
||||||
|
worker.onmessage = () => {
|
||||||
|
worker.terminate();
|
||||||
|
};
|
0
cli/tests/worker_close_race.js.out
Normal file
0
cli/tests/worker_close_race.js.out
Normal file
6
cli/tests/workers/close_race_worker.js
Normal file
6
cli/tests/workers/close_race_worker.js
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
self.postMessage("");
|
||||||
|
self.close();
|
||||||
|
}, 500);
|
|
@ -516,16 +516,16 @@ fn op_host_terminate_worker(
|
||||||
id: WorkerId,
|
id: WorkerId,
|
||||||
_: (),
|
_: (),
|
||||||
) -> Result<(), AnyError> {
|
) -> Result<(), AnyError> {
|
||||||
let worker_thread = state
|
if let Some(worker_thread) = state.borrow_mut::<WorkersTable>().remove(&id) {
|
||||||
.borrow_mut::<WorkersTable>()
|
worker_thread.worker_handle.terminate();
|
||||||
.remove(&id)
|
worker_thread
|
||||||
.expect("No worker handle found");
|
.join_handle
|
||||||
worker_thread.worker_handle.terminate();
|
.join()
|
||||||
worker_thread
|
.expect("Panic in worker thread")
|
||||||
.join_handle
|
.expect("Panic in worker event loop");
|
||||||
.join()
|
} else {
|
||||||
.expect("Panic in worker thread")
|
debug!("tried to terminate non-existent worker {}", id);
|
||||||
.expect("Panic in worker event loop");
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -602,14 +602,12 @@ fn op_host_post_message(
|
||||||
id: WorkerId,
|
id: WorkerId,
|
||||||
data: JsMessageData,
|
data: JsMessageData,
|
||||||
) -> Result<(), AnyError> {
|
) -> Result<(), AnyError> {
|
||||||
debug!("post message to worker {}", id);
|
if let Some(worker_thread) = state.borrow::<WorkersTable>().get(&id) {
|
||||||
let worker_handle = {
|
debug!("post message to worker {}", id);
|
||||||
let worker_thread = state
|
let worker_handle = worker_thread.worker_handle.clone();
|
||||||
.borrow::<WorkersTable>()
|
worker_handle.port.send(state, data)?;
|
||||||
.get(&id)
|
} else {
|
||||||
.expect("No worker handle found");
|
debug!("tried to post message to non-existent worker {}", id);
|
||||||
worker_thread.worker_handle.clone()
|
}
|
||||||
};
|
|
||||||
worker_handle.port.send(state, data)?;
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue