aboutsummaryrefslogtreecommitdiff
path: root/crates/server/src/vfs.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/server/src/vfs.rs')
-rw-r--r--crates/server/src/vfs.rs28
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 @@
1use std::{ 1use std::{
2 path::PathBuf, 2 path::PathBuf,
3 thread,
4 fs, 3 fs,
5}; 4};
6 5
7use crossbeam_channel::{Sender, Receiver, bounded}; 6use crossbeam_channel::{Sender, Receiver, bounded};
8use drop_bomb::DropBomb;
9use walkdir::WalkDir; 7use walkdir::WalkDir;
10 8
11use Result; 9use {
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
27pub struct Watcher { 27pub fn watch(roots: Vec<PathBuf>) -> (Receiver<Vec<FileEvent>>, ThreadWatcher) {
28 thread: thread::JoinHandle<()>,
29 bomb: DropBomb,
30}
31
32impl 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
40pub 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
49fn run(roots: Vec<PathBuf>, sender: Sender<Vec<FileEvent>>) { 33fn run(roots: Vec<PathBuf>, sender: Sender<Vec<FileEvent>>) {