aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_vfs/src/io.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-12-18 10:35:05 +0000
committerAleksey Kladov <[email protected]>2018-12-20 09:15:23 +0000
commite69b05781f7fb0f0dfdcd4acb433dbcde9cbb7b7 (patch)
tree3117cbb25cca518646f03e68bd91f7dc36aea571 /crates/ra_vfs/src/io.rs
parent99561cf2f20ad572c7149644a70cd7740c0f8b86 (diff)
add io::Task
Diffstat (limited to 'crates/ra_vfs/src/io.rs')
-rw-r--r--crates/ra_vfs/src/io.rs53
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
7use walkdir::WalkDir; 7use walkdir::{DirEntry, WalkDir};
8use crossbeam_channel::{Sender, Receiver}; 8use crossbeam_channel::{Sender, Receiver};
9use thread_worker::{WorkerHandle, Worker}; 9use thread_worker::{WorkerHandle};
10
11use crate::VfsRoot;
12
13pub(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)]
12pub struct FileEvent { 22pub(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)]
18pub enum FileEventKind { 28pub(crate) enum FileEventKind {
19 Add(String), 29 Add(String),
20} 30}
21 31
22pub(crate) type FsWorker = Worker<PathBuf, (PathBuf, Vec<FileEvent>)>; 32pub(crate) type Worker = thread_worker::Worker<Task, (PathBuf, Vec<FileEvent>)>;
33
34pub(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
24pub(crate) fn start() -> (FsWorker, WorkerHandle) { 42fn 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
41fn load_root(path: &Path) -> Vec<FileEvent> { 50fn load_root(path: &Path) -> Vec<FileEvent> {