From dcedaad4023a10aeb1bc9b0d22bded9675f069dd Mon Sep 17 00:00:00 2001 From: Olivier Goffart Date: Fri, 16 Apr 2021 10:56:30 +0200 Subject: [PATCH] LSP: Use the same machanism to avoid re-compiling the preview more often than needed Just use an atomic counter to count the number of pending event so that there is at most one pending event at the time. --- tools/lsp/preview.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tools/lsp/preview.rs b/tools/lsp/preview.rs index 46bf8b6e7..1c4d0013c 100644 --- a/tools/lsp/preview.rs +++ b/tools/lsp/preview.rs @@ -71,7 +71,14 @@ pub fn load_preview( component: Option, post_load_behavior: PostLoadBehavior, ) { + use std::sync::atomic::{AtomicU32, Ordering}; + const PENDING_EVENTS: AtomicU32 = AtomicU32::new(0); + if PENDING_EVENTS.load(Ordering::SeqCst) > 0 { + return; + } + PENDING_EVENTS.fetch_add(1, Ordering::SeqCst); run_in_ui_thread(Box::pin(async move { + PENDING_EVENTS.fetch_sub(1, Ordering::SeqCst); reload_preview(sender, &path, component, post_load_behavior).await })); } @@ -94,7 +101,7 @@ pub fn set_contents(path: &Path, content: String) { if cache.dependency.contains(path) { let current_root = cache.current_root.clone(); let current_component = cache.current_component.clone(); - let sender = cache.sender.take(); + let sender = cache.sender.clone(); drop(cache); if let Some(sender) = sender { load_preview(sender, current_root, current_component, PostLoadBehavior::DoNothing);