X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=os_win32.cpp;h=587503c41553fa7cd013cf5ad28862fa34f938a7;hb=2257168033b52be3094efdbd7eadff8eb77a4c4e;hp=4bfdf5e00d96373c1a7e003f42c2dfd521ef935c;hpb=1e0fc67981e101495c2e236efb37cb5db83af400;p=apitrace diff --git a/os_win32.cpp b/os_win32.cpp index 4bfdf5e..587503c 100644 --- a/os_win32.cpp +++ b/os_win32.cpp @@ -24,6 +24,7 @@ **************************************************************************/ #include +#include #include #include #include @@ -135,50 +136,40 @@ Abort(void) } -struct Interrupts -{ - Interrupts() - : set(false), - prevfilter(NULL), - handler(NULL) - {} - - bool set; - LPTOP_LEVEL_EXCEPTION_FILTER prevFilter; +static LPTOP_LEVEL_EXCEPTION_FILTER prevExceptionFilter = NULL; +static void (*gCallback)(void) = NULL; - void (*handler)(int); -}; -static Interrupts interrupts; - -LONG WINAPI InterruptHandler(EXCEPTION_POINTERS *exceptionInfo) +static LONG WINAPI UnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo) { - if (interrupts.handler) { - int exceptionCode = 0; - if (exceptionInfo) { - exceptionCode = exceptionInfo->ExceptionRecord.ExceptionCode; - } - - interrupts.handler(exceptionCode); + if (gCallback) { + gCallback(); } - if (interrupts.prevFilter) { - return interrupts.prevFilter(exceptionInfo); + if (prevExceptionFilter) { + return prevExceptionFilter(pExceptionInfo); } else { - return EXCEPTION_CONTINUE_SEARCH; + return EXCEPTION_CONTINUE_SEARCH; } } void -CatchInterrupts(void (*func)(int)) +SetExceptionCallback(void (*callback)(void)) { - interrupts.handler = func; + assert(!gCallback); - if (!interrupts.set) { - interrupts.prevFilter = - SetUnhandledExceptionFilter(InterruptHandler); - interrupts.set = true; + if (!gCallback) { + gCallback = callback; + + assert(!prevExceptionFilter); + prevExceptionFilter = SetUnhandledExceptionFilter(UnhandledExceptionFilter); } } +void +ResetExceptionCallback(void) +{ + gCallback = NULL; +} + } /* namespace OS */