Install signal handler only once.

This commit is contained in:
losfair 2018-11-28 13:21:03 +08:00
parent b9714e1ce1
commit 319bd08905

View File

@ -5,6 +5,7 @@
//! unless you have memory unsafety elsewhere in your code. //! unless you have memory unsafety elsewhere in your code.
use std::cell::UnsafeCell; use std::cell::UnsafeCell;
use std::sync::Once;
extern "C" { extern "C" {
pub fn setjmp(env: *mut ::nix::libc::c_void) -> ::nix::libc::c_int; pub fn setjmp(env: *mut ::nix::libc::c_void) -> ::nix::libc::c_int;
@ -12,6 +13,7 @@ extern "C" {
} }
const SETJMP_BUFFER_LEN: usize = 27; const SETJMP_BUFFER_LEN: usize = 27;
pub static SIGHANDLER_INIT: Once = Once::new();
thread_local! { thread_local! {
pub static SETJMP_BUFFER: UnsafeCell<[::nix::libc::c_int; SETJMP_BUFFER_LEN]> = UnsafeCell::new([0; SETJMP_BUFFER_LEN]); pub static SETJMP_BUFFER: UnsafeCell<[::nix::libc::c_int; SETJMP_BUFFER_LEN]> = UnsafeCell::new([0; SETJMP_BUFFER_LEN]);
@ -28,7 +30,7 @@ thread_local! {
macro_rules! call_protected { macro_rules! call_protected {
($x:expr) => { ($x:expr) => {
unsafe { unsafe {
use crate::recovery::{setjmp, SETJMP_BUFFER}; use crate::recovery::{setjmp, SETJMP_BUFFER, SIGHANDLER_INIT};
use crate::sighandler::install_sighandler; use crate::sighandler::install_sighandler;
use crate::webassembly::ErrorKind; use crate::webassembly::ErrorKind;
@ -37,7 +39,9 @@ macro_rules! call_protected {
let jmp_buf = SETJMP_BUFFER.with(|buf| buf.get()); let jmp_buf = SETJMP_BUFFER.with(|buf| buf.get());
let prev_jmp_buf = *jmp_buf; let prev_jmp_buf = *jmp_buf;
install_sighandler(); SIGHANDLER_INIT.call_once(|| {
install_sighandler();
});
let signum = setjmp(jmp_buf as *mut ::nix::libc::c_void); let signum = setjmp(jmp_buf as *mut ::nix::libc::c_void);
if signum != 0 { if signum != 0 {