| /* 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; | |
| } |