aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/rust-analyzer/src/global_state.rs2
-rw-r--r--crates/rust-analyzer/src/main_loop.rs16
2 files changed, 18 insertions, 0 deletions
diff --git a/crates/rust-analyzer/src/global_state.rs b/crates/rust-analyzer/src/global_state.rs
index adeb7a97e..6f2f482c1 100644
--- a/crates/rust-analyzer/src/global_state.rs
+++ b/crates/rust-analyzer/src/global_state.rs
@@ -84,6 +84,7 @@ pub(crate) struct GlobalState {
84 pub(crate) workspace_build_data: Option<BuildDataResult>, 84 pub(crate) workspace_build_data: Option<BuildDataResult>,
85 pub(crate) fetch_build_data_queue: 85 pub(crate) fetch_build_data_queue:
86 OpQueue<BuildDataCollector, Option<anyhow::Result<BuildDataResult>>>, 86 OpQueue<BuildDataCollector, Option<anyhow::Result<BuildDataResult>>>,
87 pub(crate) prime_caches_queue: OpQueue<(), ()>,
87 88
88 latest_requests: Arc<RwLock<LatestRequests>>, 89 latest_requests: Arc<RwLock<LatestRequests>>,
89} 90}
@@ -146,6 +147,7 @@ impl GlobalState {
146 workspaces: Arc::new(Vec::new()), 147 workspaces: Arc::new(Vec::new()),
147 fetch_workspaces_queue: OpQueue::default(), 148 fetch_workspaces_queue: OpQueue::default(),
148 workspace_build_data: None, 149 workspace_build_data: None,
150 prime_caches_queue: OpQueue::default(),
149 151
150 fetch_build_data_queue: OpQueue::default(), 152 fetch_build_data_queue: OpQueue::default(),
151 latest_requests: Default::default(), 153 latest_requests: Default::default(),
diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs
index a766aacad..a3e974e92 100644
--- a/crates/rust-analyzer/src/main_loop.rs
+++ b/crates/rust-analyzer/src/main_loop.rs
@@ -278,6 +278,8 @@ impl GlobalState {
278 }; 278 };
279 } 279 }
280 280
281 let mut finished = false;
282
281 for progress in prime_caches_progress { 283 for progress in prime_caches_progress {
282 let (state, message, fraction); 284 let (state, message, fraction);
283 match progress { 285 match progress {
@@ -295,11 +297,18 @@ impl GlobalState {
295 state = Progress::End; 297 state = Progress::End;
296 message = None; 298 message = None;
297 fraction = 1.0; 299 fraction = 1.0;
300 finished = true;
298 } 301 }
299 }; 302 };
300 303
301 self.report_progress("Indexing", state, message, Some(fraction)); 304 self.report_progress("Indexing", state, message, Some(fraction));
302 } 305 }
306
307 // If the task is cancelled we may observe two `PrimeCachesProgress::Finished` so we
308 // have to make sure to only call `op_completed()` once.
309 if finished {
310 self.prime_caches_queue.op_completed(());
311 }
303 } 312 }
304 Event::Vfs(mut task) => { 313 Event::Vfs(mut task) => {
305 let _p = profile::span("GlobalState::handle_event/vfs"); 314 let _p = profile::span("GlobalState::handle_event/vfs");
@@ -711,6 +720,13 @@ impl GlobalState {
711 } 720 }
712 fn update_file_notifications_on_threadpool(&mut self) { 721 fn update_file_notifications_on_threadpool(&mut self) {
713 self.maybe_update_diagnostics(); 722 self.maybe_update_diagnostics();
723
724 // Ensure that only one cache priming task can run at a time
725 self.prime_caches_queue.request_op(());
726 if self.prime_caches_queue.should_start_op().is_none() {
727 return;
728 }
729
714 self.task_pool.handle.spawn_with_sender({ 730 self.task_pool.handle.spawn_with_sender({
715 let snap = self.snapshot(); 731 let snap = self.snapshot();
716 move |sender| { 732 move |sender| {