@@ -10,10 +10,9 @@ mod include;
1010
1111use std:: convert:: { TryFrom , TryInto } ;
1212
13- use crossbeam_channel:: { select, unbounded, Receiver , Sender } ;
13+ use crossbeam_channel:: { never , select, unbounded, Receiver , Sender } ;
1414use notify:: { RecommendedWatcher , RecursiveMode , Watcher } ;
1515use paths:: { AbsPath , AbsPathBuf } ;
16- use rustc_hash:: FxHashSet ;
1716use vfs:: loader;
1817use walkdir:: WalkDir ;
1918
@@ -55,10 +54,8 @@ type NotifyEvent = notify::Result<notify::Event>;
5554struct 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
7067impl 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