Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/prime_caches.rs')
-rw-r--r--crates/ide/src/prime_caches.rs39
1 files changed, 21 insertions, 18 deletions
diff --git a/crates/ide/src/prime_caches.rs b/crates/ide/src/prime_caches.rs
index 8aef76eae8..5e38286017 100644
--- a/crates/ide/src/prime_caches.rs
+++ b/crates/ide/src/prime_caches.rs
@@ -14,7 +14,7 @@ use ide_db::{
};
use rustc_hash::FxHashSet;
-use crate::RootDatabase;
+use crate::{prime_caches, RootDatabase};
/// We're indexing many crates.
#[derive(Debug)]
@@ -54,34 +54,37 @@ pub(crate) fn parallel_prime_caches(
builder.build()
};
- let (work_sender, work_receiver) = crossbeam_channel::unbounded();
- let (progress_sender, progress_receiver) = crossbeam_channel::unbounded();
-
enum ParallelPrimeCacheWorkerProgress {
BeginCrate { crate_id: CrateId, crate_name: String },
EndCrate { crate_id: CrateId },
}
- let prime_caches_worker = move |db: Snapshot<RootDatabase>| {
- while let Ok((crate_id, crate_name)) = work_receiver.recv() {
- progress_sender
- .send(ParallelPrimeCacheWorkerProgress::BeginCrate { crate_id, crate_name })?;
+ let (work_sender, progress_receiver) = {
+ let (progress_sender, progress_receiver) = crossbeam_channel::unbounded();
+ let (work_sender, work_receiver) = crossbeam_channel::unbounded();
+ let prime_caches_worker = move |db: Snapshot<RootDatabase>| {
+ while let Ok((crate_id, crate_name)) = work_receiver.recv() {
+ progress_sender
+ .send(ParallelPrimeCacheWorkerProgress::BeginCrate { crate_id, crate_name })?;
+
+ // This also computes the DefMap
+ db.import_map(crate_id);
- // This also computes the DefMap
- db.import_map(crate_id);
+ progress_sender.send(ParallelPrimeCacheWorkerProgress::EndCrate { crate_id })?;
+ }
- progress_sender.send(ParallelPrimeCacheWorkerProgress::EndCrate { crate_id })?;
+ Ok::<_, crossbeam_channel::SendError<_>>(())
+ };
+
+ for _ in 0..num_worker_threads {
+ let worker = prime_caches_worker.clone();
+ let db = db.snapshot();
+ std::thread::spawn(move || Cancelled::catch(|| worker(db)));
}
- Ok::<_, crossbeam_channel::SendError<_>>(())
+ (work_sender, progress_receiver)
};
- for _ in 0..num_worker_threads {
- let worker = prime_caches_worker.clone();
- let db = db.snapshot();
- std::thread::spawn(move || Cancelled::catch(|| worker(db)));
- }
-
let crates_total = crates_to_prime.pending();
let mut crates_done = 0;