summaryrefslogtreecommitdiffstats
path: root/llvm/lib/System/Unix/Signals.inc
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/System/Unix/Signals.inc')
-rw-r--r--llvm/lib/System/Unix/Signals.inc19
1 files changed, 14 insertions, 5 deletions
diff --git a/llvm/lib/System/Unix/Signals.inc b/llvm/lib/System/Unix/Signals.inc
index f409cefcc35..94f6b6c4a39 100644
--- a/llvm/lib/System/Unix/Signals.inc
+++ b/llvm/lib/System/Unix/Signals.inc
@@ -55,13 +55,23 @@ static const int KillSigs[] = {
static const int *const KillSigsEnd =
KillSigs + sizeof(KillSigs) / sizeof(KillSigs[0]);
-// SignalHandler - The signal handler that runs...
+static void UnregisterHandler(int Signal) {
+ signal(Signal, SIG_DFL);
+}
+
+
+// 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.
- signal(Sig, SIG_DFL);
+ std::for_each(KillSigs, KillSigsEnd, UnregisterHandler);
+
+ // Unmask all potentially blocked kill signals.
+ sigset_t SigMask;
+ sigfillset(&SigMask);
+ sigprocmask(SIG_UNBLOCK, &SigMask, 0);
if (FilesToRemove != 0)
while (!FilesToRemove->empty()) {
@@ -86,12 +96,11 @@ static RETSIGTYPE SignalHandler(int Sig) {
}
// Just call signal
-static void RegisterHandler(int Signal) {
- signal(Signal, SignalHandler);
+static void RegisterHandler(int Signal) {
+ signal(Signal, SignalHandler);
}
-
void sys::SetInterruptFunction(void (*IF)()) {
InterruptFunction = IF;
RegisterHandler(SIGINT);
OpenPOWER on IntegriCloud