diff options
Diffstat (limited to 'crates/server/src/vfs.rs')
-rw-r--r-- | crates/server/src/vfs.rs | 28 |
1 files changed, 6 insertions, 22 deletions
diff --git a/crates/server/src/vfs.rs b/crates/server/src/vfs.rs index 2e4319cdb..2acc3f55f 100644 --- a/crates/server/src/vfs.rs +++ b/crates/server/src/vfs.rs | |||
@@ -1,14 +1,14 @@ | |||
1 | use std::{ | 1 | use std::{ |
2 | path::PathBuf, | 2 | path::PathBuf, |
3 | thread, | ||
4 | fs, | 3 | fs, |
5 | }; | 4 | }; |
6 | 5 | ||
7 | use crossbeam_channel::{Sender, Receiver, bounded}; | 6 | use crossbeam_channel::{Sender, Receiver, bounded}; |
8 | use drop_bomb::DropBomb; | ||
9 | use walkdir::WalkDir; | 7 | use walkdir::WalkDir; |
10 | 8 | ||
11 | use Result; | 9 | use { |
10 | thread_watcher::ThreadWatcher, | ||
11 | }; | ||
12 | 12 | ||
13 | 13 | ||
14 | #[derive(Debug)] | 14 | #[derive(Debug)] |
@@ -24,26 +24,10 @@ pub enum FileEventKind { | |||
24 | Remove, | 24 | Remove, |
25 | } | 25 | } |
26 | 26 | ||
27 | pub struct Watcher { | 27 | pub fn watch(roots: Vec<PathBuf>) -> (Receiver<Vec<FileEvent>>, ThreadWatcher) { |
28 | thread: thread::JoinHandle<()>, | ||
29 | bomb: DropBomb, | ||
30 | } | ||
31 | |||
32 | impl Watcher { | ||
33 | pub fn stop(mut self) -> Result<()> { | ||
34 | self.bomb.defuse(); | ||
35 | self.thread.join() | ||
36 | .map_err(|_| format_err!("file watcher died")) | ||
37 | } | ||
38 | } | ||
39 | |||
40 | pub fn watch(roots: Vec<PathBuf>) -> (Receiver<Vec<FileEvent>>, Watcher) { | ||
41 | let (sender, receiver) = bounded(16); | 28 | let (sender, receiver) = bounded(16); |
42 | let thread = thread::spawn(move || run(roots, sender)); | 29 | let watcher = ThreadWatcher::spawn("vfs", move || run(roots, sender)); |
43 | (receiver, Watcher { | 30 | (receiver, watcher) |
44 | thread, | ||
45 | bomb: DropBomb::new("Watcher should be stopped explicitly"), | ||
46 | }) | ||
47 | } | 31 | } |
48 | 32 | ||
49 | fn run(roots: Vec<PathBuf>, sender: Sender<Vec<FileEvent>>) { | 33 | fn run(roots: Vec<PathBuf>, sender: Sender<Vec<FileEvent>>) { |