factorize signal registration, part of PR3848.
authorChris Lattner <sabre@nondot.org>
Mon, 23 Mar 2009 05:42:29 +0000 (05:42 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 23 Mar 2009 05:42:29 +0000 (05:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@67508 91177308-0d34-0410-b5e6-96231b3b80d8

lib/System/Unix/Signals.inc

index e031e85b42509572e40e04881bbdddecf1e5ab6a..60e3a26314ee53c122439c05a4472f8f6a6caf4b 100644 (file)
@@ -31,6 +31,8 @@
 #endif
 using namespace llvm;
 
+static RETSIGTYPE SignalHandler(int Sig);  // defined below.
+
 /// InterruptFunction - The function to call if ctrl-c is pressed.
 static void (*InterruptFunction)() = 0;
 
@@ -55,18 +57,34 @@ static const int KillSigs[] = {
 static const int *const KillSigsEnd =
   KillSigs + sizeof(KillSigs) / sizeof(KillSigs[0]);
 
+// Just call signal
+static void RegisterHandler(int Signal) {
+   signal(Signal, SignalHandler); 
+}
+
+static void RegisterHandlers() {
+  std::for_each(IntSigs, IntSigsEnd, RegisterHandler);
+  std::for_each(KillSigs, KillSigsEnd, RegisterHandler);
+}
+
 static void UnregisterHandler(int Signal) {
-   signal(Signal, SIG_DFL); 
+ signal(Signal, SIG_DFL); 
+}
+
+static void UnregisterHandlers() {
+  std::for_each(KillSigs, KillSigsEnd, UnregisterHandler);
+  std::for_each(IntSigs, IntSigsEnd, UnregisterHandler);
 }
 
 
+
 // SignalHandler - The signal handler that runs.
 static RETSIGTYPE SignalHandler(int Sig) {
   // Restore the signal behavior to default, so that the program actually
   // crashes when we return and the signal reissues.  This also ensures that if
   // we crash in our signal handler that the program will terminate immediately
   // instead of recursing in the signal handler.
-  std::for_each(KillSigs, KillSigsEnd, UnregisterHandler);
+  UnregisterHandlers();
 
   // Unmask all potentially blocked kill signals.
   sigset_t SigMask;
@@ -95,15 +113,11 @@ static RETSIGTYPE SignalHandler(int Sig) {
       (*CallBacksToRun)[i].first((*CallBacksToRun)[i].second);
 }
 
-// Just call signal
-static void RegisterHandler(int Signal) {
-   signal(Signal, SignalHandler); 
-}
 
 
 void llvm::sys::SetInterruptFunction(void (*IF)()) {
   InterruptFunction = IF;
-  RegisterHandler(SIGINT);
+  RegisterHandlers();
 }
 
 // RemoveFileOnSignal - The public API
@@ -114,8 +128,7 @@ bool llvm::sys::RemoveFileOnSignal(const sys::Path &Filename,
 
   FilesToRemove->push_back(Filename);
 
-  std::for_each(IntSigs, IntSigsEnd, RegisterHandler);
-  std::for_each(KillSigs, KillSigsEnd, RegisterHandler);
+  RegisterHandlers();
   return false;
 }
 
@@ -126,7 +139,7 @@ void llvm::sys::AddSignalHandler(void (*FnPtr)(void *), void *Cookie) {
   if (CallBacksToRun == 0)
     CallBacksToRun = new std::vector<std::pair<void(*)(void*), void*> >();
   CallBacksToRun->push_back(std::make_pair(FnPtr, Cookie));
-  std::for_each(KillSigs, KillSigsEnd, RegisterHandler);
+  RegisterHandlers();
 }