diff options
author | Joe Wilm <joe@jwilm.com> | 2016-06-08 21:24:31 -0700 |
---|---|---|
committer | Joe Wilm <joe@jwilm.com> | 2016-06-08 21:24:31 -0700 |
commit | 8b1e82f31a7ecaade440b0694c0bbe5a843b48ac (patch) | |
tree | 0fb2e4fac0183490b62a663b9ca165e7a5e4bd0f /src/tty.rs | |
parent | 8126841ed37a9cc249f646b830b3d3d48aaf4ed7 (diff) | |
download | r-alacritty-8b1e82f31a7ecaade440b0694c0bbe5a843b48ac.tar.gz r-alacritty-8b1e82f31a7ecaade440b0694c0bbe5a843b48ac.tar.bz2 r-alacritty-8b1e82f31a7ecaade440b0694c0bbe5a843b48ac.zip |
Fix shutdown deadlock
Calling ::std::process::exit() from the SIGCHLD handler would sometimes
deadlock some OpenGL internal shutdown procedure. To resolve this, a
flag was added that can be checked with `process_should_exit`.
Diffstat (limited to 'src/tty.rs')
-rw-r--r-- | src/tty.rs | 13 |
1 files changed, 12 insertions, 1 deletions
@@ -14,6 +14,13 @@ use libc::{self, winsize, c_int, c_char, pid_t, WNOHANG, WIFEXITED, WEXITSTATUS, /// Necessary to put this in static storage for `sigchld` to have access static mut PID: pid_t = 0; +/// Exit flag +/// +/// Calling exit() in the SIGCHLD handler sometimes causes opengl to deadlock, +/// and the process hangs. Instead, this flag is set, and its status can be +/// cheked via `process_should_exit`. +static mut SHOULD_EXIT: bool = false; + extern "C" fn sigchld(a: c_int) { let mut status: c_int = 0; unsafe { @@ -29,9 +36,13 @@ extern "C" fn sigchld(a: c_int) { if !WIFEXITED(status) || WEXITSTATUS(status) != 0 { die!("child finished with error '{}'\n", status); } + + SHOULD_EXIT = true; } +} - ::std::process::exit(0); +pub fn process_should_exit() -> bool { + unsafe { SHOULD_EXIT } } pub enum Error { |