From 319bd08905f43cf7b6a6bd4b318cdeb6bd96af7a Mon Sep 17 00:00:00 2001 From: losfair Date: Wed, 28 Nov 2018 13:21:03 +0800 Subject: [PATCH] Install signal handler only once. --- src/recovery.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/recovery.rs b/src/recovery.rs index 4b296cc9e..e644b9b06 100644 --- a/src/recovery.rs +++ b/src/recovery.rs @@ -5,6 +5,7 @@ //! unless you have memory unsafety elsewhere in your code. use std::cell::UnsafeCell; +use std::sync::Once; extern "C" { 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; +pub static SIGHANDLER_INIT: Once = Once::new(); thread_local! { 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 { ($x:expr) => { unsafe { - use crate::recovery::{setjmp, SETJMP_BUFFER}; + use crate::recovery::{setjmp, SETJMP_BUFFER, SIGHANDLER_INIT}; use crate::sighandler::install_sighandler; use crate::webassembly::ErrorKind; @@ -37,7 +39,9 @@ macro_rules! call_protected { let jmp_buf = SETJMP_BUFFER.with(|buf| buf.get()); 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); if signum != 0 {