diff options
author | Chris Lattner <sabre@nondot.org> | 2009-03-23 05:42:29 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-03-23 05:42:29 +0000 |
commit | 1c4d8a00aba2b216dfd7c2b95f01752465037d70 (patch) | |
tree | 5fff177999778cb865ea2672268cc912f85eba64 /lib/System | |
parent | 3aff0a63f98f018e862e75155b6ba0ffbd8a05cd (diff) | |
download | external_llvm-1c4d8a00aba2b216dfd7c2b95f01752465037d70.zip external_llvm-1c4d8a00aba2b216dfd7c2b95f01752465037d70.tar.gz external_llvm-1c4d8a00aba2b216dfd7c2b95f01752465037d70.tar.bz2 |
factorize signal registration, part of PR3848.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@67508 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/System')
-rw-r--r-- | lib/System/Unix/Signals.inc | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/lib/System/Unix/Signals.inc b/lib/System/Unix/Signals.inc index e031e85..60e3a26 100644 --- a/lib/System/Unix/Signals.inc +++ b/lib/System/Unix/Signals.inc @@ -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(); } |