Skip to content

Commit 23258d8

Browse files
committed
Simplify file watcher
1 parent 8b0983e commit 23258d8

File tree

1 file changed

+14
-29
lines changed

1 file changed

+14
-29
lines changed

crates/vfs-notify/src/lib.rs

Lines changed: 14 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,9 @@ mod include;
1010

1111
use std::convert::{TryFrom, TryInto};
1212

13-
use crossbeam_channel::{select, unbounded, Receiver, Sender};
13+
use crossbeam_channel::{never, select, unbounded, Receiver, Sender};
1414
use notify::{RecommendedWatcher, RecursiveMode, Watcher};
1515
use paths::{AbsPath, AbsPathBuf};
16-
use rustc_hash::FxHashSet;
1716
use vfs::loader;
1817
use walkdir::WalkDir;
1918

@@ -55,10 +54,8 @@ type NotifyEvent = notify::Result<notify::Event>;
5554
struct NotifyActor {
5655
sender: loader::Sender,
5756
config: Vec<(AbsPathBuf, Include, bool)>,
58-
watched_paths: FxHashSet<AbsPathBuf>,
59-
// Drop order of fields bellow is significant,
60-
watcher: Option<RecommendedWatcher>,
61-
watcher_receiver: Receiver<NotifyEvent>,
57+
// Drop order is significant.
58+
watcher: Option<(RecommendedWatcher, Receiver<NotifyEvent>)>,
6259
}
6360

6461
#[derive(Debug)]
@@ -69,23 +66,13 @@ enum Event {
6966

7067
impl NotifyActor {
7168
fn new(sender: loader::Sender) -> NotifyActor {
72-
let (watcher_sender, watcher_receiver) = unbounded();
73-
let watcher = log_notify_error(Watcher::new_immediate(move |event| {
74-
watcher_sender.send(event).unwrap()
75-
}));
76-
77-
NotifyActor {
78-
sender,
79-
config: Vec::new(),
80-
watched_paths: FxHashSet::default(),
81-
watcher,
82-
watcher_receiver,
83-
}
69+
NotifyActor { sender, config: Vec::new(), watcher: None }
8470
}
8571
fn next_event(&self, receiver: &Receiver<Message>) -> Option<Event> {
72+
let watcher_receiver = self.watcher.as_ref().map(|(_, receiver)| receiver);
8673
select! {
8774
recv(receiver) -> it => it.ok().map(Event::Message),
88-
recv(&self.watcher_receiver) -> it => Some(Event::NotifyEvent(it.unwrap())),
75+
recv(watcher_receiver.unwrap_or(&never())) -> it => Some(Event::NotifyEvent(it.unwrap())),
8976
}
9077
}
9178
fn run(mut self, inbox: Receiver<Message>) {
@@ -94,10 +81,16 @@ impl NotifyActor {
9481
match event {
9582
Event::Message(msg) => match msg {
9683
Message::Config(config) => {
84+
self.watcher = None;
85+
let (watcher_sender, watcher_receiver) = unbounded();
86+
let watcher = log_notify_error(Watcher::new_immediate(move |event| {
87+
watcher_sender.send(event).unwrap()
88+
}));
89+
self.watcher = watcher.map(|it| (it, watcher_receiver));
90+
9791
let n_total = config.load.len();
9892
self.send(loader::Message::Progress { n_total, n_done: 0 });
9993

100-
self.unwatch_all();
10194
self.config.clear();
10295

10396
for (i, entry) in config.load.into_iter().enumerate() {
@@ -217,16 +210,8 @@ impl NotifyActor {
217210
}
218211

219212
fn watch(&mut self, path: AbsPathBuf) {
220-
if let Some(watcher) = &mut self.watcher {
213+
if let Some((watcher, _)) = &mut self.watcher {
221214
log_notify_error(watcher.watch(&path, RecursiveMode::NonRecursive));
222-
self.watched_paths.insert(path);
223-
}
224-
}
225-
fn unwatch_all(&mut self) {
226-
if let Some(watcher) = &mut self.watcher {
227-
for path in self.watched_paths.drain() {
228-
log_notify_error(watcher.unwatch(path));
229-
}
230215
}
231216
}
232217
fn send(&mut self, msg: loader::Message) {

0 commit comments

Comments
 (0)