X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=rts%2Fwin32%2FOSThreads.c;fp=rts%2Fwin32%2FOSThreads.c;h=6f3629be4b5390df9c4fce92de5e17c6f792be04;hp=32800e73bdd2b6778a3a9087e0c8ae4cdcefe767;hb=e4fdc426413d178c86d3ba93702aad5eb17734bf;hpb=80ce44f764633347ea15b570e3f758b6e7aecd63 diff --git a/rts/win32/OSThreads.c b/rts/win32/OSThreads.c index 32800e7..6f3629b 100644 --- a/rts/win32/OSThreads.c +++ b/rts/win32/OSThreads.c @@ -7,6 +7,8 @@ * * --------------------------------------------------------------------------*/ +#define _WIN32_WINNT 0x0500 + #include "Rts.h" #if defined(THREADED_RTS) #include "OSThreads.h" @@ -112,6 +114,22 @@ osThreadId() return GetCurrentThreadId(); } +rtsBool +osThreadIsAlive(OSThreadId id) +{ + DWORD exit_code; + HANDLE hdl; + if (!(hdl = OpenThread(THREAD_QUERY_INFORMATION,FALSE,id))) { + sysErrorBelch("osThreadIsAlive: OpenThread"); + stg_exit(EXIT_FAILURE); + } + if (!GetExitCodeThread(hdl, &exit_code)) { + sysErrorBelch("osThreadIsAlive: GetExitCodeThread"); + stg_exit(EXIT_FAILURE); + } + return (exit_code == STILL_ACTIVE); +} + #ifdef USE_CRITICAL_SECTIONS void initMutex (Mutex* pMut) @@ -161,7 +179,8 @@ getThreadLocalVar (ThreadLocalKey *key) // r is allowed to be NULL - it can mean that either there was an // error or the stored value is in fact NULL. if (GetLastError() != NO_ERROR) { - barf("getThreadLocalVar: key not found"); + sysErrorBelch("getThreadLocalVar"); + stg_exit(EXIT_FAILURE); } #endif return r; @@ -173,7 +192,8 @@ setThreadLocalVar (ThreadLocalKey *key, void *value) BOOL b; b = TlsSetValue(*key, value); if (!b) { - barf("setThreadLocalVar: %d", GetLastError()); + sysErrorBelch("setThreadLocalVar"); + stg_exit(EXIT_FAILURE); } }