Factor out the handler work from SignalHandler into a helper function,

and change llvm::sys::RunInterruptHandlers to call that function directly
instead of calling SignalHandler, because the rest of SignalHandler
invokes side effects which aren't appropriate, including raising the
signal.

llvm-svn: 104896
This commit is contained in:
Dan Gohman 2010-05-27 23:11:55 +00:00
parent a817a19bc6
commit 288999b829
1 changed files with 12 additions and 5 deletions

View File

@ -111,6 +111,14 @@ static void UnregisterHandlers() {
} }
/// RemoveFilesToRemove - Process the FilesToRemove list. This function
/// should be called with the SignalsMutex lock held.
static void RemoveFilesToRemove() {
while (!FilesToRemove.empty()) {
FilesToRemove.back().eraseFromDisk(true);
FilesToRemove.pop_back();
}
}
// SignalHandler - The signal handler that runs. // SignalHandler - The signal handler that runs.
static RETSIGTYPE SignalHandler(int Sig) { static RETSIGTYPE SignalHandler(int Sig) {
@ -126,10 +134,7 @@ static RETSIGTYPE SignalHandler(int Sig) {
sigprocmask(SIG_UNBLOCK, &SigMask, 0); sigprocmask(SIG_UNBLOCK, &SigMask, 0);
SignalsMutex.acquire(); SignalsMutex.acquire();
while (!FilesToRemove.empty()) { RemoveFilesToRemove();
FilesToRemove.back().eraseFromDisk(true);
FilesToRemove.pop_back();
}
if (std::find(IntSigs, IntSigsEnd, Sig) != IntSigsEnd) { if (std::find(IntSigs, IntSigsEnd, Sig) != IntSigsEnd) {
if (InterruptFunction) { if (InterruptFunction) {
@ -153,7 +158,9 @@ static RETSIGTYPE SignalHandler(int Sig) {
} }
void llvm::sys::RunInterruptHandlers() { void llvm::sys::RunInterruptHandlers() {
SignalHandler(SIGINT); SignalsMutex.acquire();
RemoveFilesToRemove();
SignalsMutex.release();
} }
void llvm::sys::SetInterruptFunction(void (*IF)()) { void llvm::sys::SetInterruptFunction(void (*IF)()) {