switch to nix for killing preview subprocess

This commit is contained in:
rabite 2020-02-12 21:23:58 +01:00
parent b3f1452a59
commit 02e767cf50
2 changed files with 18 additions and 9 deletions

View File

@ -105,7 +105,9 @@ pub enum HError {
#[fail(display = "FileBrowser needs to know about all tab's files to run exec!")]
FileBrowserNeedTabFiles,
#[fail(display = "{}", _0)]
FileError(crate::files::FileError)
FileError(crate::files::FileError),
#[fail(display = "{}", _0)]
Nix(#[cause] nix::Error)
}
impl HError {
@ -367,6 +369,13 @@ impl From<std::num::ParseIntError> for HError {
}
}
impl From<nix::Error> for HError {
fn from(error: nix::Error) -> Self {
let err = HError::Nix(error);
err
}
}
impl From<std::char::ParseCharError> for HError {
fn from(error: std::char::ParseCharError) -> Self {
let err = HError::ParseCharError(error);

View File

@ -27,16 +27,16 @@ fn kill_proc() -> HResult<()> {
pid.map(|pid|
// Do this in another thread so we can wait on process to exit with SIGHUP
std::thread::spawn(move || {
use nix::{unistd::Pid,
sys::signal::{killpg, Signal}};
let sleep_time = std::time::Duration::from_millis(50);
// Here be dragons
unsafe {
// Kill using process group, to clean up all child processes, too
// 15 = SIGTERM, 9 = SIGKILL
libc::killpg(pid as i32, 15);
std::thread::sleep(sleep_time);
libc::killpg(pid as i32, 9);
}
// Kill using process group, to clean up all child processes, too
let pid = Pid::from_raw(pid as i32);
killpg(pid, Signal::SIGTERM).log();
std::thread::sleep(sleep_time);
killpg(pid, Signal::SIGKILL).log();
})
);
*pid = None;