Fix shutdown behavoir of main cargo-watch thread.

Even though this didn't error, it became clear to me that it was closing
the wrong channel, resulting in the child thread never finishing.
This commit is contained in:
Emil Lauridsen 2019-12-27 12:42:18 +01:00
parent 59837c75f4
commit ed84c85aef

View file

@ -36,7 +36,7 @@ pub struct CheckOptions {
#[derive(Debug)]
pub struct CheckWatcher {
pub task_recv: Receiver<CheckTask>,
pub cmd_send: Sender<CheckCommand>,
pub cmd_send: Option<Sender<CheckCommand>>,
pub shared: Arc<RwLock<CheckWatcherSharedState>>,
handle: Option<JoinHandle<()>>,
}
@ -53,23 +53,24 @@ impl CheckWatcher {
let mut check = CheckWatcherState::new(options, workspace_root, shared_);
check.run(&task_send, &cmd_recv);
});
CheckWatcher { task_recv, cmd_send, handle: Some(handle), shared }
CheckWatcher { task_recv, cmd_send: Some(cmd_send), handle: Some(handle), shared }
}
/// Schedule a re-start of the cargo check worker.
pub fn update(&self) {
self.cmd_send.send(CheckCommand::Update).unwrap();
if let Some(cmd_send) = &self.cmd_send {
cmd_send.send(CheckCommand::Update).unwrap();
}
}
}
impl std::ops::Drop for CheckWatcher {
fn drop(&mut self) {
if let Some(handle) = self.handle.take() {
// Replace our reciever with dummy one, so we can drop and close the
// one actually communicating with the thread
let recv = std::mem::replace(&mut self.task_recv, crossbeam_channel::never());
// Take the sender out of the option
let recv = self.cmd_send.take();
// Dropping the original reciever finishes the thread loop
// Dropping the sender finishes the thread loop
drop(recv);
// Join the thread, it should finish shortly. We don't really care