blob: 90820a0c0e11c68e2650b2eba8bfa00494028748 [file]
/* This is simple DLL library which uses mingwthr dtor TLS callback */
#include <stdio.h>
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
static int *thread_detach_var = NULL;
__attribute__((dllexport))
void set_thread_detach_var(int *var)
{
thread_detach_var = var;
}
static void mingwthr_dtor_tls_callback(void *value)
{
if (value != (void*)42) {
printf("w64mingwthr dtor callback called with wrong value\n");
return;
}
if (thread_detach_var)
(*thread_detach_var)++;
}
static DWORD tls_key = TLS_OUT_OF_INDEXES;
/* Register mingwthr_dtor_tls_callback as mingwthr dtor TLS callback */
extern int __mingwthr_key_dtor(DWORD key, void (*dtor)(void *value));
__attribute__((constructor))
static void register_mingwthr_dtor_tls_callback(void)
{
tls_key = TlsAlloc();
if (tls_key == TLS_OUT_OF_INDEXES) {
printf("TlsAlloc() failed\n");
return;
}
if (__mingwthr_key_dtor(tls_key, &mingwthr_dtor_tls_callback) != 0)
printf("__mingwthr_key_dtor() failed\n");
}
__attribute__((destructor))
static void free_tls_key(void)
{
TlsFree(tls_key);
tls_key = TLS_OUT_OF_INDEXES;
}
BOOL WINAPI DllMain(HINSTANCE instance __attribute__((unused)), DWORD reason, LPVOID reserved __attribute__((unused)))
{
if (reason == DLL_THREAD_ATTACH)
TlsSetValue(tls_key, (void*)42);
return TRUE;
}