]> git.lizzy.rs Git - rust.git/commitdiff
hacky fix for cancelling
authorJake Heinz <jh@discordapp.com>
Fri, 14 Jan 2022 10:30:51 +0000 (10:30 +0000)
committerJake Heinz <jh@discordapp.com>
Fri, 14 Jan 2022 10:30:51 +0000 (10:30 +0000)
crates/ide/src/prime_caches.rs
crates/ide/src/prime_caches/topologic_sort.rs

index 5e382860172669652470f39b66c234721a295895..5da299555634827847b2fa3689a6547861328eb9 100644 (file)
@@ -4,6 +4,8 @@
 //! various caches, it's not really advanced at the moment.
 mod topologic_sort;
 
+use std::time::Duration;
+
 use hir::db::DefDatabase;
 use ide_db::{
     base_db::{
@@ -14,7 +16,7 @@
 };
 use rustc_hash::FxHashSet;
 
-use crate::{prime_caches, RootDatabase};
+use crate::RootDatabase;
 
 /// We're indexing many crates.
 #[derive(Debug)]
@@ -93,7 +95,7 @@ enum ParallelPrimeCacheWorkerProgress {
     let mut crates_currently_indexing =
         FxIndexMap::with_capacity_and_hasher(num_worker_threads as _, Default::default());
 
-    while !crates_to_prime.is_empty() {
+    while crates_done < crates_total {
         db.unwind_if_cancelled();
 
         for crate_id in &mut crates_to_prime {
@@ -105,9 +107,14 @@ enum ParallelPrimeCacheWorkerProgress {
                 .ok();
         }
 
-        let worker_progress = match progress_receiver.recv() {
+        // recv_timeout is somewhat a hack, we need a way to from this thread check to see if the current salsa revision
+        // is cancelled.
+        let worker_progress = match progress_receiver.recv_timeout(Duration::from_millis(10)) {
             Ok(p) => p,
-            Err(_) => {
+            Err(crossbeam_channel::RecvTimeoutError::Timeout) => {
+                continue;
+            }
+            Err(crossbeam_channel::RecvTimeoutError::Disconnected) => {
                 // our workers may have died from a cancelled task, so we'll check and re-raise here.
                 db.unwind_if_cancelled();
                 break;
index 68ba2d4a7b88e8f90f9c80b53be8f55a850552d5..f54d2c19086c94e9019078f6ccfa14963d553762 100644 (file)
@@ -60,10 +60,6 @@ pub(crate) fn pending(&self) -> usize {
         self.nodes.len()
     }
 
-    pub(crate) fn is_empty(&self) -> bool {
-        self.nodes.len() == 0 && self.ready.len() == 0
-    }
-
     pub(crate) fn mark_done(&mut self, item: T) {
         let entry = self.nodes.remove(&item).expect("invariant: unknown item marked as done");