diff --git a/lib/diagnostics.cpp b/lib/diagnostics.cpp index 5ae323596c..3d5dd7e45d 100644 --- a/lib/diagnostics.cpp +++ b/lib/diagnostics.cpp @@ -365,8 +365,13 @@ int diagnostics_init( #if defined(_WIN32) //_set_abort_behavior(NULL, _WRITE_ABORT_MSG); +#ifdef __MINGW32__ + std::set_terminate(boinc_term_func); + std::set_unexpected(boinc_term_func); +#else set_terminate(boinc_term_func); set_unexpected(boinc_term_func); +#endif #if defined(_DEBUG) diff --git a/lib/diagnostics_win.cpp b/lib/diagnostics_win.cpp index 183b763614..efb90836ea 100644 --- a/lib/diagnostics_win.cpp +++ b/lib/diagnostics_win.cpp @@ -306,7 +306,7 @@ int diagnostics_update_thread_list() { // Enumerate the threads for(uiSystemIndex = 0; uiSystemIndex < pProcesses->ThreadCount; uiSystemIndex++) { pThread = &pProcesses->Threads[uiSystemIndex]; - pThreadEntry = diagnostics_find_thread_entry((DWORD)pThread->ClientId.UniqueThread); + pThreadEntry = diagnostics_find_thread_entry((DWORD)(uintptr_t)pThread->ClientId.UniqueThread); if (pThreadEntry) { pThreadEntry->crash_kernel_time = (FLOAT)pThread->KernelTime.QuadPart; @@ -320,12 +320,12 @@ int diagnostics_update_thread_list() { hThread = OpenThread( THREAD_ALL_ACCESS, FALSE, - (DWORD)(pThread->ClientId.UniqueThread) + (DWORD)(uintptr_t)(pThread->ClientId.UniqueThread) ); pThreadEntry = new BOINC_THREADLISTENTRY; diagnostics_init_thread_entry(pThreadEntry); - pThreadEntry->thread_id = (DWORD)(pThread->ClientId.UniqueThread); + pThreadEntry->thread_id = (DWORD)(uintptr_t)(pThread->ClientId.UniqueThread); pThreadEntry->thread_handle = hThread; pThreadEntry->crash_kernel_time = (FLOAT)pThread->KernelTime.QuadPart; pThreadEntry->crash_user_time = (FLOAT)pThread->UserTime.QuadPart; diff --git a/lib/diagnostics_win.h b/lib/diagnostics_win.h index 82af90d14a..a6f6a5fc2e 100644 --- a/lib/diagnostics_win.h +++ b/lib/diagnostics_win.h @@ -27,7 +27,7 @@ typedef LONG NTSTATUS; typedef LONG KPRIORITY; //MinGW-W64 defines this struct in its own header -#ifndef HAVE_CLIENT_ID +#if !defined(HAVE_CLIENT_ID) && !defined(__MINGW32__) typedef struct _CLIENT_ID { DWORD UniqueProcess; DWORD UniqueThread; @@ -35,7 +35,7 @@ typedef struct _CLIENT_ID { #endif //MinGW-W64 defines this struct in its own header -#ifndef HAVE_VM_COUNTERS +#if !defined(HAVE_VM_COUNTERS) && !defined(__MINGW32__) typedef struct _VM_COUNTERS { #ifdef _WIN64 // the following was inferred by painful reverse engineering @@ -67,7 +67,7 @@ typedef struct _VM_COUNTERS { #endif //MinGW-W64 defines this struct in its own header -#ifndef HAVE_SYSTEM_THREADS +#if !defined(HAVE_SYSTEM_THREADS) && !defined(__MINGW32__) typedef struct _SYSTEM_THREADS { LARGE_INTEGER KernelTime; LARGE_INTEGER UserTime; @@ -112,7 +112,7 @@ typedef struct _SYSTEM_PROCESSES { #endif //MinGW-W64 defines this struct in its own header -#ifndef HAVE_THREAD_STATE +#if !defined(HAVE_THREAD_STATE) && !defined(__MINGW32__) typedef enum _THREAD_STATE { StateInitialized, StateReady,