From ed84c85aef859e97ab355e78bf77f435689f25b7 Mon Sep 17 00:00:00 2001
From: Emil Lauridsen <mine809@gmail.com>
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/ra_cargo_watch')

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<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
-- 
cgit v1.2.3