Skip to content

Commit bcc9909

Browse files
committed
hacky fix for cancelling
1 parent 6c5504a commit bcc9909

File tree

2 files changed

+11
-8
lines changed

2 files changed

+11
-8
lines changed

crates/ide/src/prime_caches.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
//! various caches, it's not really advanced at the moment.
55
mod topologic_sort;
66

7+
use std::time::Duration;
8+
79
use hir::db::DefDatabase;
810
use ide_db::{
911
base_db::{
@@ -14,7 +16,7 @@ use ide_db::{
1416
};
1517
use rustc_hash::FxHashSet;
1618

17-
use crate::{prime_caches, RootDatabase};
19+
use crate::RootDatabase;
1820

1921
/// We're indexing many crates.
2022
#[derive(Debug)]
@@ -93,7 +95,7 @@ pub(crate) fn parallel_prime_caches(
9395
let mut crates_currently_indexing =
9496
FxIndexMap::with_capacity_and_hasher(num_worker_threads as _, Default::default());
9597

96-
while !crates_to_prime.is_empty() {
98+
while crates_done < crates_total {
9799
db.unwind_if_cancelled();
98100

99101
for crate_id in &mut crates_to_prime {
@@ -105,9 +107,14 @@ pub(crate) fn parallel_prime_caches(
105107
.ok();
106108
}
107109

108-
let worker_progress = match progress_receiver.recv() {
110+
// recv_timeout is somewhat a hack, we need a way to from this thread check to see if the current salsa revision
111+
// is cancelled.
112+
let worker_progress = match progress_receiver.recv_timeout(Duration::from_millis(10)) {
109113
Ok(p) => p,
110-
Err(_) => {
114+
Err(crossbeam_channel::RecvTimeoutError::Timeout) => {
115+
continue;
116+
}
117+
Err(crossbeam_channel::RecvTimeoutError::Disconnected) => {
111118
// our workers may have died from a cancelled task, so we'll check and re-raise here.
112119
db.unwind_if_cancelled();
113120
break;

crates/ide/src/prime_caches/topologic_sort.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,6 @@ where
6060
self.nodes.len()
6161
}
6262

63-
pub(crate) fn is_empty(&self) -> bool {
64-
self.nodes.len() == 0 && self.ready.len() == 0
65-
}
66-
6763
pub(crate) fn mark_done(&mut self, item: T) {
6864
let entry = self.nodes.remove(&item).expect("invariant: unknown item marked as done");
6965

0 commit comments

Comments
 (0)