Eliminate extra thread for VfsWatcher

This commit is contained in:
Lucien Greathouse
2018-01-03 18:02:56 -08:00
parent 58b244b7e9
commit f52f43fe90
2 changed files with 47 additions and 61 deletions

View File

@@ -1,6 +1,5 @@
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use std::thread;
use std::process; use std::process;
use rand; use rand;
@@ -100,15 +99,8 @@ pub fn serve(project_path: &PathBuf, verbose: bool, port: Option<u64>) {
Arc::new(Mutex::new(vfs)) Arc::new(Mutex::new(vfs))
}; };
{
let vfs = vfs.clone();
thread::spawn(move || {
VfsWatcher::new(vfs).start();
});
}
println!("Server listening on port {}", web_config.port); println!("Server listening on port {}", web_config.port);
VfsWatcher::new(vfs.clone()).start();
web::start(web_config, project.clone(), &PLUGIN_CHAIN, vfs.clone()); web::start(web_config, project.clone(), &PLUGIN_CHAIN, vfs.clone());
} }

View File

@@ -23,71 +23,65 @@ impl VfsWatcher {
} }
pub fn start(mut self) { pub fn start(mut self) {
{ let outer_vfs = self.vfs.lock().unwrap();
let outer_vfs = self.vfs.lock().unwrap();
for (partition_name, root_path) in &outer_vfs.partitions { for (partition_name, root_path) in &outer_vfs.partitions {
let (tx, rx) = mpsc::channel(); let (tx, rx) = mpsc::channel();
let partition_name = partition_name.clone(); let partition_name = partition_name.clone();
let root_path = root_path.clone(); let root_path = root_path.clone();
let mut watcher: RecommendedWatcher = Watcher::new(tx, Duration::from_secs(1)) let mut watcher: RecommendedWatcher = Watcher::new(tx, Duration::from_secs(1))
.expect("Unable to create watcher!"); .expect("Unable to create watcher!");
watcher watcher
.watch(&root_path, RecursiveMode::Recursive) .watch(&root_path, RecursiveMode::Recursive)
.expect("Unable to watch path!"); .expect("Unable to watch path!");
self.watchers.push(watcher); self.watchers.push(watcher);
{ {
let vfs = self.vfs.clone(); let vfs = self.vfs.clone();
thread::spawn(move || { thread::spawn(move || {
loop { loop {
let event = rx.recv().unwrap(); let event = rx.recv().unwrap();
let mut vfs = vfs.lock().unwrap(); let mut vfs = vfs.lock().unwrap();
let current_time = vfs.current_time(); let current_time = vfs.current_time();
match event { match event {
DebouncedEvent::Write(ref change_path) | DebouncedEvent::Write(ref change_path) |
DebouncedEvent::Create(ref change_path) | DebouncedEvent::Create(ref change_path) |
DebouncedEvent::Remove(ref change_path) => { DebouncedEvent::Remove(ref change_path) => {
if let Some(mut route) = path_to_route(&root_path, change_path) { if let Some(mut route) = path_to_route(&root_path, change_path) {
route.insert(0, partition_name.clone()); route.insert(0, partition_name.clone());
vfs.add_change(current_time, route); vfs.add_change(current_time, route);
} else { } else {
println!("Failed to get route from {}", change_path.display()); println!("Failed to get route from {}", change_path.display());
} }
}, },
DebouncedEvent::Rename(ref from_change, ref to_change) => { DebouncedEvent::Rename(ref from_change, ref to_change) => {
if let Some(mut route) = path_to_route(&root_path, from_change) { if let Some(mut route) = path_to_route(&root_path, from_change) {
route.insert(0, partition_name.clone()); route.insert(0, partition_name.clone());
vfs.add_change(current_time, route); vfs.add_change(current_time, route);
} else { } else {
println!("Failed to get route from {}", from_change.display()); println!("Failed to get route from {}", from_change.display());
} }
if let Some(mut route) = path_to_route(&root_path, to_change) { if let Some(mut route) = path_to_route(&root_path, to_change) {
route.insert(0, partition_name.clone()); route.insert(0, partition_name.clone());
vfs.add_change(current_time, route); vfs.add_change(current_time, route);
} else { } else {
println!("Failed to get route from {}", to_change.display()); println!("Failed to get route from {}", to_change.display());
} }
}, },
_ => {}, _ => {},
}
} }
}); }
} });
} }
} }
loop {
thread::park();
}
} }
} }