[llvm-commits] [llvm] r67509 - /llvm/trunk/lib/System/Unix/Signals.inc

Chris Lattner sabre at nondot.org
Sun Mar 22 22:55:36 PDT 2009


Author: lattner
Date: Mon Mar 23 00:55:36 2009
New Revision: 67509

URL: http://llvm.org/viewvc/llvm-project?rev=67509&view=rev
Log:
When we restore signal handlers, restore them back to what they
were when we came around, not to their default handler.  This 
should fix PR3848

Modified:
    llvm/trunk/lib/System/Unix/Signals.inc

Modified: llvm/trunk/lib/System/Unix/Signals.inc
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/System/Unix/Signals.inc?rev=67509&r1=67508&r2=67509&view=diff

==============================================================================
--- llvm/trunk/lib/System/Unix/Signals.inc (original)
+++ llvm/trunk/lib/System/Unix/Signals.inc Mon Mar 23 00:55:36 2009
@@ -57,23 +57,45 @@
 static const int *const KillSigsEnd =
   KillSigs + sizeof(KillSigs) / sizeof(KillSigs[0]);
 
-// Just call signal
+static unsigned NumRegisteredSignals = 0;
+static struct {
+  struct sigaction SA;
+  int SigNo;
+} RegisteredSignalInfo[(sizeof(IntSigs)+sizeof(KillSigs))/sizeof(KillSigs[0])];
+
+
 static void RegisterHandler(int Signal) {
-   signal(Signal, SignalHandler); 
+  assert(NumRegisteredSignals <
+         sizeof(RegisteredSignalInfo)/sizeof(RegisteredSignalInfo[0]) &&
+         "Out of space for signal handlers!");
+
+  struct sigaction NewHandler;
+  
+  NewHandler.sa_handler = SignalHandler;
+  NewHandler.sa_flags = SA_NODEFER|SA_RESETHAND;
+  sigemptyset(&NewHandler.sa_mask); 
+  
+  // Install the new handler, save the old one in RegisteredSignalInfo.
+  sigaction(Signal, &NewHandler,
+            &RegisteredSignalInfo[NumRegisteredSignals].SA);
+  RegisteredSignalInfo[NumRegisteredSignals].SigNo = Signal;
+  ++NumRegisteredSignals;
 }
 
 static void RegisterHandlers() {
+  // If the handlers are already registered, we're done.
+  if (NumRegisteredSignals != 0) return;
+
   std::for_each(IntSigs, IntSigsEnd, RegisterHandler);
   std::for_each(KillSigs, KillSigsEnd, RegisterHandler);
 }
 
-static void UnregisterHandler(int Signal) {
- signal(Signal, SIG_DFL); 
-}
-
 static void UnregisterHandlers() {
-  std::for_each(KillSigs, KillSigsEnd, UnregisterHandler);
-  std::for_each(IntSigs, IntSigsEnd, UnregisterHandler);
+  // Restore all of the signal handlers to how they were before we showed up.
+  for (unsigned i = 0, e = NumRegisteredSignals; i != e; ++i)
+    sigaction(RegisteredSignalInfo[NumRegisteredSignals].SigNo,
+              &RegisteredSignalInfo[NumRegisteredSignals].SA, 0);
+  NumRegisteredSignals = 0;
 }
 
 





More information about the llvm-commits mailing list