From 80ef52f0d5f9383e9f42ae77d9cb6b77483f11a6 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 28 Jun 2020 20:00:04 +0200 Subject: Make sure to join the child --- crates/flycheck/src/lib.rs | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/crates/flycheck/src/lib.rs b/crates/flycheck/src/lib.rs index 92ec4f92e..9335098ff 100644 --- a/crates/flycheck/src/lib.rs +++ b/crates/flycheck/src/lib.rs @@ -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(); + } +} -- cgit v1.2.3