aboutsummaryrefslogtreecommitdiffstats
path: root/Alc
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2014-04-17 01:09:25 -0700
committerChris Robinson <[email protected]>2014-04-17 01:09:25 -0700
commitfbb4cbbe01b9ba2fa7b6c2450d2755c244d15151 (patch)
treed538cf6b722def304bf9195dd8bc8f38b17b804a /Alc
parente5d39a5f4c871183c7e409abff3c3a6d6c40bf17 (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.c4
-rw-r--r--Alc/rwlock.h1
-rw-r--r--Alc/threads.c7
-rw-r--r--Alc/uintmap.h2
4 files changed, 9 insertions, 5 deletions
diff --git a/Alc/ALc.c b/Alc/ALc.c
index 66ce8579..e52f938f 100644
--- a/Alc/ALc.c
+++ b/Alc/ALc.c
@@ -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);