aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Davis2022-11-24 02:07:42 +0000
committerGitHub2022-11-24 02:07:42 +0000
commite6dad960cf77a3a0fae92ee216d31c9dae59b0ec (patch)
tree3d949a868c7947533b161ba915239f6410ed28bd
parent1d21683321b9f94161be14b4ec5b506ed1669c7f (diff)
Drain pending requests on language server termination (#4852)
This prevents a freeze while shutting down when using `efm-langserver`. `efm-langserver` exits immediately after seeing a shutdown request, without responding to the request. We block awaiting the reply to the shutdown request which will never come, so we time out. This change responds to any pending requests with `Err` saying that the stream has been closed.
-rw-r--r--helix-lsp/src/transport.rs10
1 files changed, 10 insertions, 0 deletions
diff --git a/helix-lsp/src/transport.rs b/helix-lsp/src/transport.rs
index 68b3d15e..3e3e06ee 100644
--- a/helix-lsp/src/transport.rs
+++ b/helix-lsp/src/transport.rs
@@ -251,6 +251,16 @@ impl Transport {
};
}
Err(Error::StreamClosed) => {
+ // Close any outstanding requests.
+ for (id, tx) in transport.pending_requests.lock().await.drain() {
+ match tx.send(Err(Error::StreamClosed)).await {
+ Ok(_) => (),
+ Err(_) => {
+ error!("Could not close request on a closed channel (id={:?})", id)
+ }
+ }
+ }
+
// Hack: inject a terminated notification so we trigger code that needs to happen after exit
use lsp_types::notification::Notification as _;
let notification =