From ed84c85aef859e97ab355e78bf77f435689f25b7 Mon Sep 17 00:00:00 2001 From: Emil Lauridsen Date: Fri, 27 Dec 2019 12:42:18 +0100 Subject: 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. --- crates/ra_cargo_watch/src/lib.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'crates') diff --git a/crates/ra_cargo_watch/src/lib.rs b/crates/ra_cargo_watch/src/lib.rs index d17edd775..11b624abf 100644 --- a/crates/ra_cargo_watch/src/lib.rs +++ b/crates/ra_cargo_watch/src/lib.rs @@ -36,7 +36,7 @@ pub struct CheckOptions { #[derive(Debug)] pub struct CheckWatcher { pub task_recv: Receiver, - pub cmd_send: Sender, + pub cmd_send: Option>, pub shared: Arc>, handle: Option>, } @@ -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 -- cgit v1.2.3