summaryrefslogtreecommitdiff
path: root/lib/System/Unix/Signals.inc
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2009-08-17 17:07:22 +0000
committerOwen Anderson <resistor@mac.com>2009-08-17 17:07:22 +0000
commit6ae8c73acad76fdf9660ca88b5c07722eaf0a8e8 (patch)
treebeedf05b6200532eb78e8f37504513f79d5dfd8c /lib/System/Unix/Signals.inc
parent76d5ccf6afd5ae253cf3d5c2cf6acc712643d8cb (diff)
downloadllvm-6ae8c73acad76fdf9660ca88b5c07722eaf0a8e8.tar.gz
llvm-6ae8c73acad76fdf9660ca88b5c07722eaf0a8e8.tar.bz2
llvm-6ae8c73acad76fdf9660ca88b5c07722eaf0a8e8.tar.xz
Add locking around signal handler registration.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@79254 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/System/Unix/Signals.inc')
-rw-r--r--lib/System/Unix/Signals.inc14
1 files changed, 14 insertions, 0 deletions
diff --git a/lib/System/Unix/Signals.inc b/lib/System/Unix/Signals.inc
index e385e0c556..d39e1e99a0 100644
--- a/lib/System/Unix/Signals.inc
+++ b/lib/System/Unix/Signals.inc
@@ -14,6 +14,7 @@
#include "Unix.h"
#include "llvm/ADT/STLExtras.h"
+#include "llvm/System/Mutex.h"
#include <vector>
#include <algorithm>
#if HAVE_EXECINFO_H
@@ -33,6 +34,8 @@ using namespace llvm;
static RETSIGTYPE SignalHandler(int Sig); // defined below.
+static SmartMutex<true> SignalsMutex;
+
/// InterruptFunction - The function to call if ctrl-c is pressed.
static void (*InterruptFunction)() = 0;
@@ -113,6 +116,7 @@ static RETSIGTYPE SignalHandler(int Sig) {
sigfillset(&SigMask);
sigprocmask(SIG_UNBLOCK, &SigMask, 0);
+ SignalsMutex.acquire();
if (FilesToRemove != 0)
while (!FilesToRemove->empty()) {
FilesToRemove->back().eraseFromDisk(true);
@@ -122,14 +126,19 @@ static RETSIGTYPE SignalHandler(int Sig) {
if (std::find(IntSigs, IntSigsEnd, Sig) != IntSigsEnd) {
if (InterruptFunction) {
void (*IF)() = InterruptFunction;
+ SignalsMutex.release();
InterruptFunction = 0;
IF(); // run the interrupt function.
return;
}
+
+ SignalsMutex.release();
raise(Sig); // Execute the default handler.
return;
}
+ SignalsMutex.release();
+
// Otherwise if it is a fault (like SEGV) run any handler.
if (CallBacksToRun)
for (unsigned i = 0, e = CallBacksToRun->size(); i != e; ++i)
@@ -139,18 +148,23 @@ static RETSIGTYPE SignalHandler(int Sig) {
void llvm::sys::SetInterruptFunction(void (*IF)()) {
+ SignalsMutex.acquire();
InterruptFunction = IF;
+ SignalsMutex.release();
RegisterHandlers();
}
// RemoveFileOnSignal - The public API
bool llvm::sys::RemoveFileOnSignal(const sys::Path &Filename,
std::string* ErrMsg) {
+ SignalsMutex.acquire();
if (FilesToRemove == 0)
FilesToRemove = new std::vector<sys::Path>();
FilesToRemove->push_back(Filename);
+ SignalsMutex.release();
+
RegisterHandlers();
return false;
}