diff options
author | Simon Marlow <simonmar@microsoft.com> | 2007-02-01 11:40:47 +0000 |
---|---|---|
committer | Simon Marlow <simonmar@microsoft.com> | 2007-02-01 11:40:47 +0000 |
commit | e4fdc426413d178c86d3ba93702aad5eb17734bf (patch) | |
tree | 8f80665cec5201ae2ff67cb36041d3a82a391a2d /rts/win32/OSThreads.c | |
parent | 80ce44f764633347ea15b570e3f758b6e7aecd63 (diff) | |
download | haskell-e4fdc426413d178c86d3ba93702aad5eb17734bf.tar.gz |
Partial fix for #926
It seems that when a program exits with open DLLs on Windows, the
system attempts to shut down the DLLs, but it also terminates (some
of?) the running threads. The RTS isn't prepared for threads to die
unexpectedly, so it sits around waiting for its workers to finish.
This bites in two places: ShutdownIOManager() in the the unthreaded
RTS, and shutdownCapability() in the threaded RTS. So far I've
modified the latter to notice when worker threads have died
unexpectedly and continue shutting down. It seems a bit trickier to
fix the unthreaded RTS, so for now the workaround for #926 is to use
the threaded RTS.
Diffstat (limited to 'rts/win32/OSThreads.c')
-rw-r--r-- | rts/win32/OSThreads.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/rts/win32/OSThreads.c b/rts/win32/OSThreads.c index 32800e73bd..6f3629be4b 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); } } |