mirror of
https://github.com/zed-industries/zed.git
synced 2025-01-12 05:15:00 +00:00
🎨 BackgroundScanner::run
This commit is contained in:
parent
89e99d2902
commit
a0e98ccc35
1 changed files with 22 additions and 19 deletions
|
@ -2225,39 +2225,42 @@ impl BackgroundScanner {
|
|||
.unwrap();
|
||||
drop(tx);
|
||||
|
||||
// Spawn a worker thread per logical CPU.
|
||||
self.executor
|
||||
.scoped(|scope| {
|
||||
// One the first worker thread, listen for change requests from the worktree.
|
||||
// For each change request, after refreshing the given paths, report
|
||||
// a progress update for the snapshot.
|
||||
// While the scan is running, listen for path update requests from the worktree,
|
||||
// and report updates to the worktree based on a timer.
|
||||
scope.spawn(async {
|
||||
let reporting_timer = self.delay().fuse();
|
||||
let reporting_timer = self.pause_between_initializing_updates().fuse();
|
||||
futures::pin_mut!(reporting_timer);
|
||||
|
||||
loop {
|
||||
select_biased! {
|
||||
job = changed_paths.next().fuse() => {
|
||||
let Some((abs_paths, barrier)) = job else { break };
|
||||
self.update_entries_for_paths(abs_paths, None).await;
|
||||
if self.notify.unbounded_send(ScanState::Initializing {
|
||||
snapshot: self.snapshot.lock().clone(),
|
||||
barrier: Some(barrier),
|
||||
}).is_err() {
|
||||
if self
|
||||
.notify
|
||||
.unbounded_send(ScanState::Initializing {
|
||||
snapshot: self.snapshot.lock().clone(),
|
||||
barrier: Some(barrier),
|
||||
})
|
||||
.is_err()
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
_ = reporting_timer => {
|
||||
reporting_timer.set(self.delay().fuse());
|
||||
if self.notify.unbounded_send(ScanState::Initializing {
|
||||
snapshot: self.snapshot.lock().clone(),
|
||||
barrier: None,
|
||||
}).is_err() {
|
||||
if self
|
||||
.notify
|
||||
.unbounded_send(ScanState::Initializing {
|
||||
snapshot: self.snapshot.lock().clone(),
|
||||
barrier: None,
|
||||
})
|
||||
.is_err()
|
||||
{
|
||||
break;
|
||||
}
|
||||
reporting_timer.set(self.pause_between_initializing_updates().fuse());
|
||||
}
|
||||
|
||||
job = rx.recv().fuse() => {
|
||||
let Ok(job) = job else { break };
|
||||
if let Err(err) = self
|
||||
|
@ -2271,7 +2274,7 @@ impl BackgroundScanner {
|
|||
}
|
||||
});
|
||||
|
||||
// On all of the remaining worker threads, just scan directories.
|
||||
// Spawn worker threads to scan the directory recursively.
|
||||
for _ in 1..self.executor.num_cpus() {
|
||||
scope.spawn(async {
|
||||
while let Ok(job) = rx.recv().await {
|
||||
|
@ -2367,7 +2370,7 @@ impl BackgroundScanner {
|
|||
}
|
||||
}
|
||||
|
||||
async fn delay(&self) {
|
||||
async fn pause_between_initializing_updates(&self) {
|
||||
#[cfg(any(test, feature = "test-support"))]
|
||||
if self.fs.is_fake() {
|
||||
return self.executor.simulate_random_delay().await;
|
||||
|
|
Loading…
Reference in a new issue