X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=os_win32.cpp;h=587503c41553fa7cd013cf5ad28862fa34f938a7;hb=46c4a32730c5b52c119376042a84a6773d8d789f;hp=2e28ec8695967b15e9f636f0dfc0eaaef8c7b0f5;hpb=1630be10e241e2741af716988da3e51dded481a6;p=apitrace diff --git a/os_win32.cpp b/os_win32.cpp index 2e28ec8..587503c 100644 --- a/os_win32.cpp +++ b/os_win32.cpp @@ -24,7 +24,10 @@ **************************************************************************/ #include +#include +#include #include +#include #include "os.hpp" @@ -37,7 +40,7 @@ namespace OS { */ static CRITICAL_SECTION CriticalSection = { - (_CRITICAL_SECTION_DEBUG *)-1, -1, 0, 0, 0, 0 + (PCRITICAL_SECTION_DEBUG)-1, -1, 0, 0, 0, 0 }; @@ -69,7 +72,7 @@ GetProcessName(char *str, size_t size) lpProcessExt = strrchr(lpProcessName, '.'); if (lpProcessExt) { - *lpProcessExt = '\0'; + *lpProcessExt = '\0'; } strncpy(str, lpProcessName, size); @@ -77,5 +80,96 @@ GetProcessName(char *str, size_t size) return true; } +bool +GetCurrentDir(char *str, size_t size) +{ + DWORD ret; + ret = GetCurrentDirectoryA(size, str); + str[size - 1] = 0; + return ret == 0 ? false : true; +} + +void +DebugMessage(const char *format, ...) +{ + char buf[4096]; + + va_list ap; + va_start(ap, format); + fflush(stdout); + vsnprintf(buf, sizeof buf, format, ap); + va_end(ap); + + OutputDebugStringA(buf); + + /* + * Also write the message to stderr, when a debugger is not present (to + * avoid duplicate messages in command line debuggers). + */ +#if _WIN32_WINNT > 0x0400 + if (!IsDebuggerPresent()) { + fflush(stdout); + fputs(buf, stderr); + fflush(stderr); + } +#endif +} + +long long GetTime(void) +{ + static LARGE_INTEGER frequency; + LARGE_INTEGER counter; + if (!frequency.QuadPart) + QueryPerformanceFrequency(&frequency); + QueryPerformanceCounter(&counter); + return counter.QuadPart*1000000LL/frequency.QuadPart; +} + +void +Abort(void) +{ +#ifndef NDEBUG + DebugBreak(); +#else + ExitProcess(0); +#endif +} + + +static LPTOP_LEVEL_EXCEPTION_FILTER prevExceptionFilter = NULL; +static void (*gCallback)(void) = NULL; + +static LONG WINAPI UnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo) +{ + if (gCallback) { + gCallback(); + } + + if (prevExceptionFilter) { + return prevExceptionFilter(pExceptionInfo); + } else { + return EXCEPTION_CONTINUE_SEARCH; + } +} + +void +SetExceptionCallback(void (*callback)(void)) +{ + assert(!gCallback); + + if (!gCallback) { + gCallback = callback; + + assert(!prevExceptionFilter); + prevExceptionFilter = SetUnhandledExceptionFilter(UnhandledExceptionFilter); + } +} + +void +ResetExceptionCallback(void) +{ + gCallback = NULL; +} + } /* namespace OS */