This website requires JavaScript.
Explore
Help
Sign in
foster
/
denoland-deno
Watch
1
Star
0
Fork
You've already forked denoland-deno
0
mirror of
https://github.com/denoland/deno.git
synced
2024-11-25 15:29:32 -05:00
Code
Issues
Packages
1
Wiki
Activity
9c0e6369b2
denoland-deno
/
tests
/
testdata
/
workers
/
message_before_close.js
5 lines
53 B
JavaScript
Raw
Normal View
History
Unescape
Escape
tests: make worker test deterministic (#12361)
2021-10-07 16:53:09 -04:00
onmessage
=
(
)
=>
{
postMessage
(
{
}
)
;
close
(
)
;
Don't drop messages from workers that have already been closed (#11913) When `worker.terminate()` is called, the spec requires that the corresponding port message queue is emptied, so no messages can be received after the call, even if they were sent from the worker before it was terminated. The spec doesn't require this of `self.close()`, and since Deno uses different channels to send messages and to notify that the worker was closed, messages might still arrive after the worker is known to be closed, which are currently being dropped. This change fixes that. The fix involves two parts: one on the JS side and one on the Rust side. The JS side was using the `#terminated` flag to keep track of whether the worker is known to be closed, without distinguishing whether further messages should be dropped or not. This PR changes that flag to an enum `#state`, which can be one of `"RUNNING"`, `"CLOSED"` or `"TERMINATED"`. The Rust side was removing the `WorkerThread` struct from the workers table when a close control was received, regardless of whether there were any messages left to read, which made any subsequent calls to `op_host_recv_message` to return `Ok(None)`, as if there were no more mesasges. This change instead waits for both a close control and for the message channel's sender to be closed before the worker thread is removed from the table.
2021-09-06 05:05:02 -04:00
}
;
Copy permalink