Common/Assert: Fix incorrect windows platform detection

This commit is contained in:
Connor McLaughlin 2020-01-17 21:36:31 +10:00
parent 25004f882e
commit 159786c3f1
2 changed files with 19 additions and 14 deletions

View file

@ -3,18 +3,17 @@
#include <cstdlib> #include <cstdlib>
#include <mutex> #include <mutex>
#ifdef Y_PLATFORM_WINDOWS #ifdef WIN32
#define WIN32_LEAN_AND_MEAN 1 #include "windows_headers.h"
#include <intrin.h> #include <intrin.h>
#include <tlhelp32.h> #include <tlhelp32.h>
#include <windows.h>
#endif #endif
static std::mutex s_AssertFailedMutex; static std::mutex s_AssertFailedMutex;
static inline void FreezeThreads(void** ppHandle) static inline void FreezeThreads(void** ppHandle)
{ {
#ifdef Y_PLATFORM_WINDOWS #ifdef WIN32
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (hSnapshot != INVALID_HANDLE_VALUE) if (hSnapshot != INVALID_HANDLE_VALUE)
{ {
@ -44,7 +43,7 @@ static inline void FreezeThreads(void** ppHandle)
static inline void ResumeThreads(void* pHandle) static inline void ResumeThreads(void* pHandle)
{ {
#ifdef Y_PLATFORM_WINDOWS #ifdef WIN32
HANDLE hSnapshot = (HANDLE)pHandle; HANDLE hSnapshot = (HANDLE)pHandle;
if (pHandle != INVALID_HANDLE_VALUE) if (pHandle != INVALID_HANDLE_VALUE)
{ {
@ -80,13 +79,16 @@ void Y_OnAssertFailed(const char* szMessage, const char* szFunction, const char*
char szMsg[512]; char szMsg[512];
std::snprintf(szMsg, sizeof(szMsg), "%s in function %s (%s:%u)", szMessage, szFunction, szFile, uLine); std::snprintf(szMsg, sizeof(szMsg), "%s in function %s (%s:%u)", szMessage, szFunction, szFile, uLine);
#ifdef Y_PLATFORM_WINDOWS #ifdef WIN32
SetConsoleTextAttribute(GetStdHandle(STD_ERROR_HANDLE), FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY); SetConsoleTextAttribute(GetStdHandle(STD_ERROR_HANDLE), FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
WriteConsoleA(GetStdHandle(STD_ERROR_HANDLE), szMsg, Y_strlen(szMsg), NULL, NULL); WriteConsoleA(GetStdHandle(STD_ERROR_HANDLE), szMsg, static_cast<DWORD>(std::strlen(szMsg)), NULL, NULL);
OutputDebugStringA(szMsg); OutputDebugStringA(szMsg);
Y_strncat(szMsg, sizeof(szMsg), std::snprintf(
"\n\nPress Abort to exit, Retry to break to debugger, or Ignore to attempt to continue."); szMsg, sizeof(szMsg),
"%s in function %s (%s:%u)\n\nPress Abort to exit, Retry to break to debugger, or Ignore to attempt to continue.",
szMessage, szFunction, szFile, uLine);
int result = MessageBoxA(NULL, szMsg, NULL, MB_ABORTRETRYIGNORE | MB_ICONERROR); int result = MessageBoxA(NULL, szMsg, NULL, MB_ABORTRETRYIGNORE | MB_ICONERROR);
if (result == IDRETRY) if (result == IDRETRY)
__debugbreak(); __debugbreak();
@ -112,13 +114,16 @@ void Y_OnPanicReached(const char* szMessage, const char* szFunction, const char*
char szMsg[512]; char szMsg[512];
std::snprintf(szMsg, sizeof(szMsg), "%s in function %s (%s:%u)", szMessage, szFunction, szFile, uLine); std::snprintf(szMsg, sizeof(szMsg), "%s in function %s (%s:%u)", szMessage, szFunction, szFile, uLine);
#ifdef Y_PLATFORM_WINDOWS #ifdef WIN32
SetConsoleTextAttribute(GetStdHandle(STD_ERROR_HANDLE), FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY); SetConsoleTextAttribute(GetStdHandle(STD_ERROR_HANDLE), FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
WriteConsoleA(GetStdHandle(STD_ERROR_HANDLE), szMsg, Y_strlen(szMsg), NULL, NULL); WriteConsoleA(GetStdHandle(STD_ERROR_HANDLE), szMsg, static_cast<DWORD>(std::strlen(szMsg)), NULL, NULL);
OutputDebugStringA(szMsg); OutputDebugStringA(szMsg);
Y_strncat(szMsg, sizeof(szMsg), std::snprintf(szMsg, sizeof(szMsg),
"\n\nDo you want to attempt to break into a debugger? Pressing Cancel will abort the application."); "%s in function %s (%s:%u)\n\nDo you want to attempt to break into a debugger? Pressing Cancel will "
"abort the application.",
szMessage, szFunction, szFile, uLine);
int result = MessageBoxA(NULL, szMsg, NULL, MB_OKCANCEL | MB_ICONERROR); int result = MessageBoxA(NULL, szMsg, NULL, MB_OKCANCEL | MB_ICONERROR);
if (result == IDOK) if (result == IDOK)
__debugbreak(); __debugbreak();

View file

@ -14,7 +14,7 @@ void Y_OnPanicReached(const char* szMessage, const char* szFunction, const char*
Y_OnAssertFailed("Assertion failed: '" msg "'", __FUNCTION__, __FILE__, __LINE__); \ Y_OnAssertFailed("Assertion failed: '" msg "'", __FUNCTION__, __FILE__, __LINE__); \
} }
#if Y_BUILD_CONFIG_DEBUG #ifdef _DEBUG
#define DebugAssert(expr) \ #define DebugAssert(expr) \
if (!(expr)) \ if (!(expr)) \
{ \ { \