diff options
Diffstat (limited to 'crates/ra_vfs/src/io.rs')
-rw-r--r-- | crates/ra_vfs/src/io.rs | 53 |
1 files changed, 31 insertions, 22 deletions
diff --git a/crates/ra_vfs/src/io.rs b/crates/ra_vfs/src/io.rs index 257f1bf53..c46760583 100644 --- a/crates/ra_vfs/src/io.rs +++ b/crates/ra_vfs/src/io.rs | |||
@@ -4,38 +4,47 @@ use std::{ | |||
4 | thread::JoinHandle, | 4 | thread::JoinHandle, |
5 | }; | 5 | }; |
6 | 6 | ||
7 | use walkdir::WalkDir; | 7 | use walkdir::{DirEntry, WalkDir}; |
8 | use crossbeam_channel::{Sender, Receiver}; | 8 | use crossbeam_channel::{Sender, Receiver}; |
9 | use thread_worker::{WorkerHandle, Worker}; | 9 | use thread_worker::{WorkerHandle}; |
10 | |||
11 | use crate::VfsRoot; | ||
12 | |||
13 | pub(crate) enum Task { | ||
14 | ScanRoot { | ||
15 | root: VfsRoot, | ||
16 | path: PathBuf, | ||
17 | filter: Box<FnMut(&DirEntry) -> bool + Send>, | ||
18 | }, | ||
19 | } | ||
10 | 20 | ||
11 | #[derive(Debug)] | 21 | #[derive(Debug)] |
12 | pub struct FileEvent { | 22 | pub(crate) struct FileEvent { |
13 | pub path: PathBuf, | 23 | pub(crate) path: PathBuf, |
14 | pub kind: FileEventKind, | 24 | pub(crate) kind: FileEventKind, |
15 | } | 25 | } |
16 | 26 | ||
17 | #[derive(Debug)] | 27 | #[derive(Debug)] |
18 | pub enum FileEventKind { | 28 | pub(crate) enum FileEventKind { |
19 | Add(String), | 29 | Add(String), |
20 | } | 30 | } |
21 | 31 | ||
22 | pub(crate) type FsWorker = Worker<PathBuf, (PathBuf, Vec<FileEvent>)>; | 32 | pub(crate) type Worker = thread_worker::Worker<Task, (PathBuf, Vec<FileEvent>)>; |
33 | |||
34 | pub(crate) fn start() -> (Worker, WorkerHandle) { | ||
35 | thread_worker::spawn("vfs", 128, |input_receiver, output_sender| { | ||
36 | input_receiver | ||
37 | .map(handle_task) | ||
38 | .for_each(|it| output_sender.send(it)) | ||
39 | }) | ||
40 | } | ||
23 | 41 | ||
24 | pub(crate) fn start() -> (FsWorker, WorkerHandle) { | 42 | fn handle_task(task: Task) -> (PathBuf, Vec<FileEvent>) { |
25 | thread_worker::spawn::<PathBuf, (PathBuf, Vec<FileEvent>), _>( | 43 | let Task::ScanRoot { path, .. } = task; |
26 | "vfs", | 44 | log::debug!("loading {} ...", path.as_path().display()); |
27 | 128, | 45 | let events = load_root(path.as_path()); |
28 | |input_receiver, output_sender| { | 46 | log::debug!("... loaded {}", path.as_path().display()); |
29 | input_receiver | 47 | (path, events) |
30 | .map(|path| { | ||
31 | log::debug!("loading {} ...", path.as_path().display()); | ||
32 | let events = load_root(path.as_path()); | ||
33 | log::debug!("... loaded {}", path.as_path().display()); | ||
34 | (path, events) | ||
35 | }) | ||
36 | .for_each(|it| output_sender.send(it)) | ||
37 | }, | ||
38 | ) | ||
39 | } | 48 | } |
40 | 49 | ||
41 | fn load_root(path: &Path) -> Vec<FileEvent> { | 50 | fn load_root(path: &Path) -> Vec<FileEvent> { |