mirror of
https://github.com/zed-industries/zed.git
synced 2025-02-03 08:54:04 +00:00
Parallelize scanning of changed directories
This commit is contained in:
parent
fd12117288
commit
fbd5fbd703
1 changed files with 35 additions and 40 deletions
|
@ -434,7 +434,6 @@ impl BackgroundScanner {
|
||||||
Duration::from_millis(100),
|
Duration::from_millis(100),
|
||||||
|events| {
|
|events| {
|
||||||
if let Err(err) = scanner.process_events(events) {
|
if let Err(err) = scanner.process_events(events) {
|
||||||
dbg!(err);
|
|
||||||
// TODO: handle errors
|
// TODO: handle errors
|
||||||
false
|
false
|
||||||
} else {
|
} else {
|
||||||
|
@ -637,6 +636,7 @@ impl BackgroundScanner {
|
||||||
let mut paths = events.into_iter().map(|e| &*e.path).collect::<Vec<_>>();
|
let mut paths = events.into_iter().map(|e| &*e.path).collect::<Vec<_>>();
|
||||||
paths.sort_unstable();
|
paths.sort_unstable();
|
||||||
|
|
||||||
|
let (scan_queue_tx, scan_queue_rx) = crossbeam_channel::unbounded();
|
||||||
let mut paths = paths.into_iter().peekable();
|
let mut paths = paths.into_iter().peekable();
|
||||||
while let Some(path) = paths.next() {
|
while let Some(path) = paths.next() {
|
||||||
let relative_path = path.strip_prefix(&root_path)?.to_path_buf();
|
let relative_path = path.strip_prefix(&root_path)?.to_path_buf();
|
||||||
|
@ -685,45 +685,16 @@ impl BackgroundScanner {
|
||||||
};
|
};
|
||||||
self.insert_entries(Some(dir_entry.clone()));
|
self.insert_entries(Some(dir_entry.clone()));
|
||||||
|
|
||||||
let (tx, rx) = crossbeam_channel::unbounded();
|
scan_queue_tx
|
||||||
|
.send(Ok(ScanJob {
|
||||||
tx.send(Ok(ScanJob {
|
ino: inode,
|
||||||
ino: inode,
|
path: Arc::from(path),
|
||||||
path: Arc::from(path),
|
relative_path,
|
||||||
relative_path,
|
dir_entry,
|
||||||
dir_entry,
|
ignore: Some(ignore),
|
||||||
ignore: Some(ignore),
|
scan_queue: scan_queue_tx.clone(),
|
||||||
scan_queue: tx.clone(),
|
}))
|
||||||
}))
|
.unwrap();
|
||||||
.unwrap();
|
|
||||||
drop(tx);
|
|
||||||
|
|
||||||
let mut inodes = Vec::new();
|
|
||||||
inodes.resize_with(self.thread_pool.workers(), || Ok(Vec::new()));
|
|
||||||
self.thread_pool.scoped(|pool| {
|
|
||||||
for worker_inodes in &mut inodes {
|
|
||||||
pool.execute(|| {
|
|
||||||
let worker_inodes = worker_inodes;
|
|
||||||
while let Ok(job) = rx.recv() {
|
|
||||||
if let Err(err) = job.and_then(|job| {
|
|
||||||
self.scan_dir(
|
|
||||||
job,
|
|
||||||
Some(worker_inodes.as_mut().unwrap()),
|
|
||||||
)
|
|
||||||
}) {
|
|
||||||
*worker_inodes = Err(err);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
for worker_inodes in inodes {
|
|
||||||
for inode in worker_inodes? {
|
|
||||||
removed.remove(&inode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
self.insert_entries(Some(Entry::File {
|
self.insert_entries(Some(Entry::File {
|
||||||
parent,
|
parent,
|
||||||
|
@ -742,7 +713,31 @@ impl BackgroundScanner {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
drop(scan_queue_tx);
|
||||||
|
|
||||||
|
let mut inodes = Vec::new();
|
||||||
|
inodes.resize_with(self.thread_pool.workers(), || Ok(Vec::new()));
|
||||||
|
self.thread_pool.scoped(|pool| {
|
||||||
|
for worker_inodes in &mut inodes {
|
||||||
|
pool.execute(|| {
|
||||||
|
let worker_inodes = worker_inodes;
|
||||||
|
while let Ok(job) = scan_queue_rx.recv() {
|
||||||
|
if let Err(err) = job.and_then(|job| {
|
||||||
|
self.scan_dir(job, Some(worker_inodes.as_mut().unwrap()))
|
||||||
|
}) {
|
||||||
|
*worker_inodes = Err(err);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
for worker_inodes in inodes {
|
||||||
|
for inode in worker_inodes? {
|
||||||
|
removed.remove(&inode);
|
||||||
|
}
|
||||||
|
}
|
||||||
self.remove_entries(removed);
|
self.remove_entries(removed);
|
||||||
|
|
||||||
Ok(self.notify.receiver_count() != 0)
|
Ok(self.notify.receiver_count() != 0)
|
||||||
|
|
Loading…
Reference in a new issue