Merge "Fix fault handler to unregister on shutdown"
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 @@
   fault_manager.HandleFault(sig, info, context);
 }
 
-FaultManager::FaultManager() {
+FaultManager::FaultManager() : initialized_(false) {
   sigaction(SIGSEGV, nullptr, &oldaction_);
 }
 
@@ -50,6 +50,7 @@
 
 
 void FaultManager::Init() {
+  CHECK(!initialized_);
   struct sigaction action;
   action.sa_sigaction = art_fault_handler;
   sigemptyset(&action.sa_mask);
@@ -65,6 +66,14 @@
   }
   // 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 @@
   ~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 @@
   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 @@
     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 @@
 
   // 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 @@
   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;