diff options
author | Chris Robinson <[email protected]> | 2014-04-17 01:09:25 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2014-04-17 01:09:25 -0700 |
commit | fbb4cbbe01b9ba2fa7b6c2450d2755c244d15151 (patch) | |
tree | d538cf6b722def304bf9195dd8bc8f38b17b804a /Alc | |
parent | e5d39a5f4c871183c7e409abff3c3a6d6c40bf17 (diff) |
Keep TlsDestructors within threads.c
This basically makes the threads implementation self-contained in threads.c and
threads.h, except for the UIntMap/RWLock implementations.
Diffstat (limited to 'Alc')
-rw-r--r-- | Alc/ALc.c | 4 | ||||
-rw-r--r-- | Alc/rwlock.h | 1 | ||||
-rw-r--r-- | Alc/threads.c | 7 | ||||
-rw-r--r-- | Alc/uintmap.h | 2 |
4 files changed, 9 insertions, 5 deletions
@@ -786,8 +786,6 @@ static void alc_init(void); static void alc_deinit(void); static void alc_deinit_safe(void); -extern UIntMap TlsDestructors; - #ifndef AL_LIBTYPE_STATIC BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD reason, LPVOID lpReserved) { @@ -797,7 +795,6 @@ BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD reason, LPVOID lpReserved) /* Pin the DLL so we won't get unloaded until the process terminates */ GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_PIN | GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (WCHAR*)hModule, &hModule); - InitUIntMap(&TlsDestructors, ~0); alc_init(); break; @@ -809,7 +806,6 @@ BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD reason, LPVOID lpReserved) alc_deinit(); else alc_deinit_safe(); - ResetUIntMap(&TlsDestructors); break; } return TRUE; diff --git a/Alc/rwlock.h b/Alc/rwlock.h index efbab4e8..0c321a11 100644 --- a/Alc/rwlock.h +++ b/Alc/rwlock.h @@ -11,6 +11,7 @@ typedef struct { volatile ALenum read_entry_lock; volatile ALenum write_lock; } RWLock; +#define RWLOCK_STATIC_INITIALIZE { 0, 0, AL_FALSE, AL_FALSE, AL_FALSE } void RWLockInit(RWLock *lock); void ReadLock(RWLock *lock); diff --git a/Alc/threads.c b/Alc/threads.c index ca004903..cf9e5bed 100644 --- a/Alc/threads.c +++ b/Alc/threads.c @@ -205,12 +205,17 @@ int almtx_timedlock(almtx_t *mtx, const struct timespec *ts) * function pointer in a ".CRT$XLx" section (where x is a character A to Z) * ensures the CRT will call it similar to DllMain. */ -UIntMap TlsDestructors; +static UIntMap TlsDestructors = UINTMAP_STATIC_INITIALIZE; static void NTAPI altss_callback(void* UNUSED(handle), DWORD reason, void* UNUSED(reserved)) { ALsizei i; + if(reason == DLL_PROCESS_DETACH) + { + ResetUIntMap(&TlsDestructors); + return; + } if(reason != DLL_THREAD_DETACH) return; diff --git a/Alc/uintmap.h b/Alc/uintmap.h index 6fc1190e..611ed39b 100644 --- a/Alc/uintmap.h +++ b/Alc/uintmap.h @@ -14,6 +14,8 @@ typedef struct UIntMap { ALsizei limit; RWLock lock; } UIntMap; +#define UINTMAP_STATIC_INITIALIZE_N(_n) { NULL, 0, 0, (_n), RWLOCK_STATIC_INITIALIZE } +#define UINTMAP_STATIC_INITIALIZE UINTMAP_STATIC_INITIALIZE_N(~0) void InitUIntMap(UIntMap *map, ALsizei limit); void ResetUIntMap(UIntMap *map); |