ruff server
no longer hangs after shutdown
#11222
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
Fixes #11207.
The server would hang after handling a shutdown request on
IoThreads::join()
because a global sender (MESSENGER
, used to sendwindow/showMessage
notifications) would remain allocated even after the event loop finished, which kept the writer I/O thread channel open.To fix this, I've made a few structural changes to
ruff server
. I've wrapped the send/receive channels and thread join handle behind a new struct,Connection
, which facilitates message sending and receiving, and also runsIoThreads::join()
after the event loop finishes. To control the number of sender channels, theConnection
wraps the sender channel in anArc
and only allows the creation of a wrapper type,ClientSender
, which hold a weak reference to thisArc
instead of direct channel access. The wrapper type implements the channel methods directly to prevent access to the inner channel (which would allow the channel to be cloned). ClientSender's function is analogous toWeakSender
intokio
. Additionally, the receiver channel cannot be accessed directly - theConnection
only exposes an iterator over it.These changes will guarantee that all channels are closed before the I/O threads are joined.
Test Plan
Repeatedly open and close an editor utilizing
ruff server
while observing the task monitor. The net total amount of openruff
instances should be zero once all editor windows have closed.The following logs should also appear after the server is shut down:
This can be tested on VS Code by changing the settings and then checking
Output
.