diff --git a/lib/System/Unix/Signals.inc b/lib/System/Unix/Signals.inc index a9af969d5ba..a643dbf972c 100644 --- a/lib/System/Unix/Signals.inc +++ b/lib/System/Unix/Signals.inc @@ -24,6 +24,9 @@ namespace { +/// InterruptFunction - The function to call if ctrl-c is pressed. +void (*InterruptFunction)() = 0; + std::vector *FilesToRemove = 0 ; std::vector *DirectoriesToRemove = 0; @@ -116,8 +119,16 @@ RETSIGTYPE SignalHandler(int Sig) { DirectoriesToRemove->pop_back(); } - if (std::find(IntSigs, IntSigsEnd, Sig) != IntSigsEnd) - exit(1); // If this is an interrupt signal, exit the program + if (std::find(IntSigs, IntSigsEnd, Sig) != IntSigsEnd) { + if (InterruptFunction) { + void (*IF)() = InterruptFunction; + InterruptFunction = 0; + IF(); // run the interrupt function. + return; + } else { + exit(1); // If this is an interrupt signal, exit the program + } + } // Otherwise if it is a fault (like SEGV) output the stacktrace to // STDERR (if we can) and reissue the signal to die... @@ -134,6 +145,11 @@ void RegisterHandler(int Signal) { namespace llvm { +void sys::SetInterruptFunction(void (*IF)()) { + InterruptFunction = IF; + RegisterHandler(SIGINT); +} + // RemoveFileOnSignal - The public API void sys::RemoveFileOnSignal(const sys::Path &Filename) { if (FilesToRemove == 0) diff --git a/lib/System/Win32/Signals.inc b/lib/System/Win32/Signals.inc index 07d399a50c8..a2c7ae2c307 100644 --- a/lib/System/Win32/Signals.inc +++ b/lib/System/Win32/Signals.inc @@ -109,6 +109,10 @@ void sys::PrintStackTraceOnErrorSignal() { LeaveCriticalSection(&CriticalSection); } + +void sys::SetInterruptFunction(void (*IF)()) { + // Currently unimplemented. +} } static void Cleanup() {