From cf84a59e5a4ef196659b3df0966832ea67868c4e Mon Sep 17 00:00:00 2001 From: Ivan Petkov Date: Sun, 16 Jun 2019 10:35:40 -0700 Subject: [PATCH] process: Don't kill child on drop if already successfully killed --- src/lib.rs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 462cec031..7464b69d7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -398,7 +398,13 @@ impl ChildDropGuard { impl Kill for ChildDropGuard { fn kill(&mut self) -> io::Result<()> { - self.inner.kill() + let ret = self.inner.kill(); + + if ret.is_ok() { + self.kill_on_drop = false; + } + + ret } } @@ -811,6 +817,20 @@ mod test { assert_eq!(0, mock.num_polls); } + #[test] + fn no_kill_if_already_killed() { + let mut mock = Mock::new(); + + { + let mut guard = ChildDropGuard::new(&mut mock); + let _ = guard.kill(); + drop(guard); + } + + assert_eq!(1, mock.num_kills); + assert_eq!(0, mock.num_polls); + } + #[test] fn no_kill_if_reaped() { let mut mock_pending = Mock::with_result(Ok(Async::NotReady));