]> git.lizzy.rs Git - rust.git/commitdiff
Make sure to join the child
authorAleksey Kladov <aleksey.kladov@gmail.com>
Sun, 28 Jun 2020 18:00:04 +0000 (20:00 +0200)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Sun, 28 Jun 2020 18:00:04 +0000 (20:00 +0200)
crates/flycheck/src/lib.rs

index 92ec4f92e3102fab0eae76d65c0ac1db37a2a9d7..9335098ff09725b3baf1f7e4a0321ebe0b95e716 100644 (file)
@@ -5,8 +5,9 @@
 use std::{
     fmt,
     io::{self, BufReader},
+    ops,
     path::PathBuf,
-    process::{Command, Stdio},
+    process::{self, Command, Stdio},
     time::Duration,
 };
 
@@ -236,8 +237,9 @@ fn run_cargo(
     mut command: Command,
     on_message: &mut dyn FnMut(cargo_metadata::Message) -> bool,
 ) -> io::Result<()> {
-    let mut child =
+    let child =
         command.stdout(Stdio::piped()).stderr(Stdio::null()).stdin(Stdio::null()).spawn()?;
+    let mut child = ChildKiller(child);
 
     // We manually read a line at a time, instead of using serde's
     // stream deserializers, because the deserializer cannot recover
@@ -283,3 +285,24 @@ fn run_cargo(
 
     Ok(())
 }
+
+struct ChildKiller(process::Child);
+
+impl ops::Deref for ChildKiller {
+    type Target = process::Child;
+    fn deref(&self) -> &process::Child {
+        &self.0
+    }
+}
+
+impl ops::DerefMut for ChildKiller {
+    fn deref_mut(&mut self) -> &mut process::Child {
+        &mut self.0
+    }
+}
+
+impl Drop for ChildKiller {
+    fn drop(&mut self) {
+        let _ = self.0.kill();
+    }
+}