blob: 5e32e3fdbd18d3bcd6803724efd47d94ee1cc27e [file]
/* This is simple DLL library which uses w64mingwthr 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 w64mingwthr_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 w64mingwthr_dtor_tls_callback as w64mingwthr dtor TLS callback */
extern int ___w64_mingwthr_add_key_dtor(DWORD key, void (*dtor)(void *value));
__attribute__((constructor))
static void register_w64mingwthr_dtor_tls_callback(void)
{
tls_key = TlsAlloc();
if (tls_key == TLS_OUT_OF_INDEXES) {
printf("TlsAlloc() failed\n");
return;
}
if (___w64_mingwthr_add_key_dtor(tls_key, &w64mingwthr_dtor_tls_callback) != 0)
printf("___w64_mingwthr_add_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;
}