mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-02 07:32:52 +00:00
Implement SetInterruptFunction for Windows.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22582 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7e608bbb5d
commit
ee841a1a87
@ -42,7 +42,8 @@ namespace sys {
|
|||||||
/// being killed, and the interrupt function automatically disabled. Note
|
/// being killed, and the interrupt function automatically disabled. Note
|
||||||
/// that interrupt functions are not allowed to call any non-reentrant
|
/// that interrupt functions are not allowed to call any non-reentrant
|
||||||
/// functions. An null interrupt function pointer disables the current
|
/// functions. An null interrupt function pointer disables the current
|
||||||
/// installed function.
|
/// installed function. Note also that the handler may be executed on a
|
||||||
|
/// different thread on some platforms.
|
||||||
/// @brief Register a function to be called when ctrl-c is pressed.
|
/// @brief Register a function to be called when ctrl-c is pressed.
|
||||||
void SetInterruptFunction(void (*IF)());
|
void SetInterruptFunction(void (*IF)());
|
||||||
} // End sys namespace
|
} // End sys namespace
|
||||||
|
@ -29,6 +29,9 @@
|
|||||||
static LONG WINAPI LLVMUnhandledExceptionFilter(LPEXCEPTION_POINTERS ep);
|
static LONG WINAPI LLVMUnhandledExceptionFilter(LPEXCEPTION_POINTERS ep);
|
||||||
static BOOL WINAPI LLVMConsoleCtrlHandler(DWORD dwCtrlType);
|
static BOOL WINAPI LLVMConsoleCtrlHandler(DWORD dwCtrlType);
|
||||||
|
|
||||||
|
// InterruptFunction - The function to call if ctrl-c is pressed.
|
||||||
|
static void (*InterruptFunction)() = 0;
|
||||||
|
|
||||||
static std::vector<llvm::sys::Path> *FilesToRemove = NULL;
|
static std::vector<llvm::sys::Path> *FilesToRemove = NULL;
|
||||||
static std::vector<llvm::sys::Path> *DirectoriesToRemove = NULL;
|
static std::vector<llvm::sys::Path> *DirectoriesToRemove = NULL;
|
||||||
static bool RegisteredUnhandledExceptionFilter = false;
|
static bool RegisteredUnhandledExceptionFilter = false;
|
||||||
@ -111,7 +114,9 @@ void sys::PrintStackTraceOnErrorSignal() {
|
|||||||
|
|
||||||
|
|
||||||
void sys::SetInterruptFunction(void (*IF)()) {
|
void sys::SetInterruptFunction(void (*IF)()) {
|
||||||
// Currently unimplemented.
|
InterruptFunction = IF;
|
||||||
|
RegisterHandler();
|
||||||
|
LeaveCriticalSection(&CriticalSection);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -234,9 +239,28 @@ static LONG WINAPI LLVMUnhandledExceptionFilter(LPEXCEPTION_POINTERS ep) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static BOOL WINAPI LLVMConsoleCtrlHandler(DWORD dwCtrlType) {
|
static BOOL WINAPI LLVMConsoleCtrlHandler(DWORD dwCtrlType) {
|
||||||
|
EnterCriticalSection(&CriticalSection);
|
||||||
Cleanup();
|
Cleanup();
|
||||||
|
|
||||||
|
// If an interrupt function has been set, go and run one it; otherwise,
|
||||||
|
// the process dies.
|
||||||
|
void (*IF)() = InterruptFunction;
|
||||||
|
InterruptFunction = 0; // Don't run it on another CTRL-C.
|
||||||
|
|
||||||
|
if (IF) {
|
||||||
|
try {
|
||||||
|
IF(); // Run it now.
|
||||||
|
} catch (...) {
|
||||||
|
// Kill the process on an exception.
|
||||||
|
LeaveCriticalSection(&CriticalSection);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
LeaveCriticalSection(&CriticalSection);
|
||||||
|
return TRUE; // Don't kill the process.
|
||||||
|
}
|
||||||
|
|
||||||
// Allow normal processing to take place; i.e., the process dies.
|
// Allow normal processing to take place; i.e., the process dies.
|
||||||
|
LeaveCriticalSection(&CriticalSection);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user