perf: eliminate tokio::sync::Mutex across async boundaries in stub and nvim-core
This commit is contained in:
1 parent
573c9586fd
commit
5715625220
5 files changed
+64
-25
No files matched your search
@@ -150,8 +150,8 @@ async fn get_nvim_connection() -> Result<mpsc::Sender<NvimRequest>, String> {
|
||||
|
||||
let (mut read_half, mut write_half) = tokio::io::split(stream);
|
||||
let (tx, mut rx) = mpsc::channel::<NvimRequest>(32);
|
||||
type PendingRequestsMap = Arc<Mutex<HashMap<String, oneshot::Sender<Result<rmpv::Value, String>>>>>;
|
||||
let pending_requests: PendingRequestsMap = Arc::new(Mutex::new(HashMap::new()));
|
||||
type PendingRequestsMap = Arc<std::sync::Mutex<HashMap<String, oneshot::Sender<Result<rmpv::Value, String>>>>>;
|
||||
let pending_requests: PendingRequestsMap = Arc::new(std::sync::Mutex::new(HashMap::new()));
|
||||
|
||||
// Write task
|
||||
let pending_clone = Arc::clone(&pending_requests);
|
||||
@@ -163,7 +163,7 @@ async fn get_nvim_connection() -> Result<mpsc::Sender<NvimRequest>, String> {
|
||||
continue;
|
||||
}
|
||||
|
||||
pending_clone.lock().await.insert(req.msgid_str.clone(), req.reply);
|
||||
pending_clone.lock().unwrap().insert(req.msgid_str.clone(), req.reply);
|
||||
|
||||
if write_half.write_all(&buf).await.is_err() {
|
||||
tracing::error!("Failed to write to Neovim socket");
|
||||
@@ -190,7 +190,7 @@ async fn get_nvim_connection() -> Result<mpsc::Sender<NvimRequest>, String> {
|
||||
let msgid = &arr[1];
|
||||
let msgid_str = format!("{:?}", msgid);
|
||||
|
||||
if let Some(reply_sender) = pending_clone2.lock().await.remove(&msgid_str) {
|
||||
if let Some(reply_sender) = pending_clone2.lock().unwrap().remove(&msgid_str) {
|
||||
let _ = reply_sender.send(Ok(val));
|
||||
}
|
||||
}
|
||||
@@ -225,7 +225,7 @@ async fn get_nvim_connection() -> Result<mpsc::Sender<NvimRequest>, String> {
|
||||
}
|
||||
|
||||
// Cleanup pending requests on disconnect
|
||||
let mut pending = pending_clone2.lock().await;
|
||||
let mut pending = pending_clone2.lock().unwrap();
|
||||
for (_, sender) in pending.drain() {
|
||||
let _ = sender.send(Err("Connection closed".to_string()));
|
||||
}
|
||||
@@ -240,7 +240,7 @@ async fn get_nvim_connection() -> Result<mpsc::Sender<NvimRequest>, String> {
|
||||
if Arc::strong_count(&pending_clone3) <= 1 {
|
||||
break; // Socket closed and other tasks finished, no need to keep cleaning up
|
||||
}
|
||||
pending_clone3.lock().await.retain(|_, sender| !sender.is_closed());
|
||||
pending_clone3.lock().unwrap().retain(|_, sender| !sender.is_closed());
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
Reference in new issue
Block a user