summaryrefslogtreecommitdiff
path: root/runtime/ops/process.rs
diff options
context:
space:
mode:
authorAndreu Botella <abb@randomunok.com>2021-09-06 11:05:02 +0200
committerGitHub <noreply@github.com>2021-09-06 11:05:02 +0200
commitb7c2902c9752e83dc467ce6a812dab4726f200d9 (patch)
tree0259c7ece9a6f66729b23c34776aab3adf7c8844 /runtime/ops/process.rs
parent930cb0afd8c7e7b8f85051156c716119eceeeb37 (diff)
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.
Diffstat (limited to 'runtime/ops/process.rs')
0 files changed, 0 insertions, 0 deletions