summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Allison <dallison@google.com>2014-08-20 17:38:41 -0700
committerDave Allison <dallison@google.com>2014-08-21 12:04:02 -0700
commit1f8ef6fa2fb5d79799371f8bf745824b78bc48f2 (patch)
tree0ecf06cfc561501ad65ad774848ce2f30808c123
parent00b3024b350afef115bddea712705bdb4877ac11 (diff)
downloadart-1f8ef6fa2fb5d79799371f8bf745824b78bc48f2.zip
art-1f8ef6fa2fb5d79799371f8bf745824b78bc48f2.tar.gz
art-1f8ef6fa2fb5d79799371f8bf745824b78bc48f2.tar.bz2
Fix fault handler to unregister on shutdown
This fixes a problem with the fault handler where it wasn't unregistering itself during shutdown of the runtime. Bug: 17133266 (cherry picked from commit e8b9afcd0cd86b8808af29a97332038aab70c604) Change-Id: I1a4ec4292ec049046dda30769265680201729efb
-rw-r--r--runtime/fault_handler.cc11
-rw-r--r--runtime/fault_handler.h2
-rw-r--r--runtime/runtime.cc3
-rw-r--r--sigchainlib/sigchain.cc3
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;