@@ -169,21 +169,30 @@ impl FlycheckActor {
169
169
}
170
170
fn next_event ( & self , inbox : & Receiver < Restart > ) -> Option < Event > {
171
171
let check_chan = self . cargo_handle . as_ref ( ) . map ( |cargo| & cargo. receiver ) ;
172
+ if let Ok ( msg) = inbox. try_recv ( ) {
173
+ // give restarts a preference so check outputs don't block a restart or stop
174
+ return Some ( Event :: Restart ( msg) ) ;
175
+ }
172
176
select ! {
173
177
recv( inbox) -> msg => msg. ok( ) . map( Event :: Restart ) ,
174
178
recv( check_chan. unwrap_or( & never( ) ) ) -> msg => Some ( Event :: CheckEvent ( msg. ok( ) ) ) ,
175
179
}
176
180
}
177
181
fn run ( mut self , inbox : Receiver < Restart > ) {
178
- while let Some ( event) = self . next_event ( & inbox) {
182
+ ' event : while let Some ( event) = self . next_event ( & inbox) {
179
183
match event {
180
184
Event :: Restart ( Restart :: No ) => {
181
185
self . cancel_check_process ( ) ;
182
186
}
183
187
Event :: Restart ( Restart :: Yes ) => {
184
188
// Cancel the previously spawned process
185
189
self . cancel_check_process ( ) ;
186
- while let Ok ( _) = inbox. recv_timeout ( Duration :: from_millis ( 50 ) ) { }
190
+ while let Ok ( restart) = inbox. recv_timeout ( Duration :: from_millis ( 50 ) ) {
191
+ // restart chained with a stop, so just cancel
192
+ if let Restart :: No = restart {
193
+ continue ' event;
194
+ }
195
+ }
187
196
188
197
let command = self . check_command ( ) ;
189
198
tracing:: debug!( ?command, "will restart flycheck" ) ;
0 commit comments