diff --git a/nvim-core/src/lib.rs b/nvim-core/src/lib.rs index f7903d5..16a85d8 100644 --- a/nvim-core/src/lib.rs +++ b/nvim-core/src/lib.rs @@ -113,7 +113,7 @@ async fn get_socket_path() -> Result { } use std::sync::LazyLock; use std::sync::Arc; -use tokio::sync::{Mutex, mpsc, oneshot}; +use tokio::sync::{mpsc, oneshot}; use std::collections::HashMap; @@ -123,13 +123,15 @@ pub struct NvimRequest { pub reply: oneshot::Sender>, } -static NVIM_CONN: LazyLock>>>> = LazyLock::new(|| Arc::new(Mutex::new(None))); +static NVIM_CONN: LazyLock>>>> = LazyLock::new(|| Arc::new(std::sync::Mutex::new(None))); async fn get_nvim_connection() -> Result, String> { - let mut conn_lock = NVIM_CONN.lock().await; - if let Some(sender) = conn_lock.as_ref() { - if !sender.is_closed() { - return Ok(sender.clone()); + { + let conn_lock = NVIM_CONN.lock().unwrap(); + if let Some(sender) = conn_lock.as_ref() { + if !sender.is_closed() { + return Ok(sender.clone()); + } } } @@ -244,6 +246,13 @@ async fn get_nvim_connection() -> Result, String> { } }); + let mut conn_lock = NVIM_CONN.lock().unwrap(); + if let Some(existing_sender) = conn_lock.as_ref() { + if !existing_sender.is_closed() { + // Another task established the connection while we were waiting + return Ok(existing_sender.clone()); + } + } *conn_lock = Some(tx.clone()); Ok(tx) }