diff options
-rw-r--r-- | runtime/fault_handler.cc | 11 | ||||
-rw-r--r-- | runtime/fault_handler.h | 2 | ||||
-rw-r--r-- | runtime/runtime.cc | 3 | ||||
-rw-r--r-- | sigchainlib/sigchain.cc | 3 |
4 files changed, 16 insertions, 3 deletions
diff --git a/runtime/fault_handler.cc b/runtime/fault_handler.cc index 8ddaf5c..68fad7b 100644 --- a/runtime/fault_handler.cc +++ b/runtime/fault_handler.cc @@ -41,7 +41,7 @@ static void art_fault_handler(int sig, siginfo_t* info, void* context) { fault_manager.HandleFault(sig, info, context); } -FaultManager::FaultManager() { +FaultManager::FaultManager() : initialized_(false) { sigaction(SIGSEGV, nullptr, &oldaction_); } @@ -50,6 +50,7 @@ FaultManager::~FaultManager() { void FaultManager::Init() { + CHECK(!initialized_); struct sigaction action; action.sa_sigaction = art_fault_handler; sigemptyset(&action.sa_mask); @@ -65,6 +66,14 @@ void FaultManager::Init() { } // Make sure our signal handler is called before any user handlers. ClaimSignalChain(SIGSEGV, &oldaction_); + initialized_ = true; +} + +void FaultManager::Shutdown() { + if (initialized_) { + UnclaimSignalChain(SIGSEGV); + initialized_ = false; + } } void FaultManager::HandleFault(int sig, siginfo_t* info, void* context) { diff --git a/runtime/fault_handler.h b/runtime/fault_handler.h index 1acd024..0e9b908 100644 --- a/runtime/fault_handler.h +++ b/runtime/fault_handler.h @@ -39,6 +39,7 @@ class FaultManager { ~FaultManager(); void Init(); + void Shutdown(); void HandleFault(int sig, siginfo_t* info, void* context); void AddHandler(FaultHandler* handler, bool generated_code); @@ -58,6 +59,7 @@ class FaultManager { std::vector<FaultHandler*> generated_code_handlers_; std::vector<FaultHandler*> other_handlers_; struct sigaction oldaction_; + bool initialized_; DISALLOW_COPY_AND_ASSIGN(FaultManager); }; diff --git a/runtime/runtime.cc b/runtime/runtime.cc index ba53c43..ee8cbe1 100644 --- a/runtime/runtime.cc +++ b/runtime/runtime.cc @@ -169,6 +169,9 @@ Runtime::~Runtime() { BackgroundMethodSamplingProfiler::Shutdown(); } + // Shutdown the fault manager if it was initialized. + fault_manager.Shutdown(); + Trace::Shutdown(); // Make sure to let the GC complete if it is running. diff --git a/sigchainlib/sigchain.cc b/sigchainlib/sigchain.cc index 6f93083..2ba7405 100644 --- a/sigchainlib/sigchain.cc +++ b/sigchainlib/sigchain.cc @@ -45,8 +45,8 @@ class SignalAction { // Unclaim the signal and restore the old action. void Unclaim(int signal) { - claimed_ = false; sigaction(signal, &action_, NULL); // Restore old action. + claimed_ = false; } // Get the action associated with this signal. @@ -164,7 +164,6 @@ int sigaction(int signal, const struct sigaction* new_action, struct sigaction* return linked_sigaction(signal, new_action, old_action); } - int sigprocmask(int how, const sigset_t* bionic_new_set, sigset_t* bionic_old_set) { const sigset_t* new_set_ptr = bionic_new_set; sigset_t tmpset; |