From e5085dfef662be2c90300be678d22a042d2545b0 Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Sat, 25 May 2024 12:25:17 +0200 Subject: [PATCH] lsp: explicitly drop locks in handle_input (#12276) Due to lifetime extension rules, we were holding onto the request handler map mutex during parsing of the request itself. This had no grand repercussions; it only prevented registering a handler for next request until parsing of the previous one was done. Release Notes: - N/A --- crates/lsp/src/lsp.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/crates/lsp/src/lsp.rs b/crates/lsp/src/lsp.rs index 2d789b976b..73a7129ba9 100644 --- a/crates/lsp/src/lsp.rs +++ b/crates/lsp/src/lsp.rs @@ -452,24 +452,27 @@ impl LanguageServer { } if let Ok(msg) = serde_json::from_slice::(&buffer) { - if let Some(handler) = notification_handlers.lock().get_mut(msg.method) { + let mut notification_handlers = notification_handlers.lock(); + if let Some(handler) = notification_handlers.get_mut(msg.method) { handler( msg.id, msg.params.map(|params| params.get()).unwrap_or("null"), cx.clone(), ); } else { + drop(notification_handlers); on_unhandled_notification(msg); } } else if let Ok(AnyResponse { id, error, result, .. }) = serde_json::from_slice(&buffer) { + let mut response_handlers = response_handlers.lock(); if let Some(handler) = response_handlers - .lock() .as_mut() .and_then(|handlers| handlers.remove(&id)) { + drop(response_handlers); if let Some(error) = error { handler(Err(error)); } else if let Some(result) = result {