Unnamed repository; edit this file 'description' to name the repository.
Properly implement Drop for JodGroupChild
Lukas Wirth 2022-11-25
parent 81d26e7 · commit c8b6fef
-rw-r--r--crates/flycheck/src/lib.rs13
1 files changed, 10 insertions, 3 deletions
diff --git a/crates/flycheck/src/lib.rs b/crates/flycheck/src/lib.rs
index 8f93dad06e..f13088cd90 100644
--- a/crates/flycheck/src/lib.rs
+++ b/crates/flycheck/src/lib.rs
@@ -360,13 +360,20 @@ impl FlycheckActor {
}
}
-struct JodChild(GroupChild);
+struct JodGroupChild(GroupChild);
+
+impl Drop for JodGroupChild {
+ fn drop(&mut self) {
+ _ = self.0.kill();
+ _ = self.0.wait();
+ }
+}
/// A handle to a cargo process used for fly-checking.
struct CargoHandle {
/// The handle to the actual cargo process. As we cannot cancel directly from with
/// a read syscall dropping and therefore terminating the process is our best option.
- child: JodChild,
+ child: JodGroupChild,
thread: jod_thread::JoinHandle<io::Result<(bool, String)>>,
receiver: Receiver<CargoMessage>,
}
@@ -374,7 +381,7 @@ struct CargoHandle {
impl CargoHandle {
fn spawn(mut command: Command) -> std::io::Result<CargoHandle> {
command.stdout(Stdio::piped()).stderr(Stdio::piped()).stdin(Stdio::null());
- let mut child = command.group_spawn().map(JodChild)?;
+ let mut child = command.group_spawn().map(JodGroupChild)?;
let stdout = child.0.inner().stdout.take().unwrap();
let stderr = child.0.inner().stderr.take().unwrap();