From fa8c292ebd893b3effef4ead9c88d261c628c340 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 2 Aug 2005 02:14:22 +0000 Subject: [PATCH] Implement sys::SetInterruptFunction on Unix, stub it on win32 so that the build will not fail git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22578 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/System/Unix/Signals.inc | 20 ++++++++++++++++++-- lib/System/Win32/Signals.inc | 4 ++++ 2 files changed, 22 insertions(+), 2 deletions(-) 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() {