Skip to content

Commit d9a2488

Browse files
committed
WIP: Add debug logging around winpthreads and tls_atexit
1 parent 819a6ec commit d9a2488

File tree

4 files changed

+46
-0
lines changed

4 files changed

+46
-0
lines changed

mingw-w64-crt/crt/tls_atexit.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ static void run_dtor_list(dtor_obj **ptr) {
5858
return;
5959
while (*ptr) {
6060
dtor_obj *cur = *ptr;
61+
fprintf(stderr, "run_dtor_list obj %p\n", cur->obj); fflush(stderr);
6162
*ptr = cur->next;
6263
cur->dtor(cur->obj);
6364
free(cur);
@@ -87,8 +88,12 @@ int __mingw_cxa_thread_atexit(dtor_fn dtor, void *obj, void *dso) {
8788
}
8889

8990
static void WINAPI tls_atexit_callback(HANDLE __UNUSED_PARAM(hDllHandle), DWORD dwReason, LPVOID __UNUSED_PARAM(lpReserved)) {
91+
fprintf(stderr, "tls_atexit_callback reason %d\n", dwReason);
92+
fflush(stderr);
9093
if (dwReason == DLL_PROCESS_DETACH) {
9194
dtor_obj **p = (dtor_obj **)TlsGetValue(tls_dtors_slot);
95+
fprintf(stderr, "tls_atexit_callback DLL_PROCESS_DETACH\n");
96+
fflush(stderr);
9297
run_dtor_list(p);
9398
free(p);
9499
TlsSetValue(tls_dtors_slot, NULL);
@@ -101,6 +106,8 @@ static void WINAPI tls_callback(HANDLE hDllHandle, DWORD dwReason, LPVOID __UNUS
101106
dtor_obj **p;
102107
switch (dwReason) {
103108
case DLL_PROCESS_ATTACH:
109+
fprintf(stderr, "tls_callback DLL_PROCESS_ATTACH\n");
110+
fflush(stderr);
104111
if (inited == 0) {
105112
InitializeCriticalSection(&lock);
106113
__dso_handle = hDllHandle;
@@ -121,6 +128,8 @@ static void WINAPI tls_callback(HANDLE hDllHandle, DWORD dwReason, LPVOID __UNUS
121128
inited = 1;
122129
break;
123130
case DLL_PROCESS_DETACH:
131+
fprintf(stderr, "tls_callback DLL_PROCESS_DETACH\n");
132+
fflush(stderr);
124133
/*
125134
* If there are other threads still running that haven't been detached,
126135
* we don't attempt to run their destructors (MSVC doesn't either), but
@@ -142,7 +151,11 @@ static void WINAPI tls_callback(HANDLE hDllHandle, DWORD dwReason, LPVOID __UNUS
142151
* standard says, but differs from what MSVC does with a dynamically
143152
* linked CRT (which still runs TLS destructors for the main thread).
144153
*/
154+
fprintf(stderr, "tls_callback DLL_PROCESS_DETACH1\n");
155+
fflush(stderr);
145156
if (__mingw_module_is_dll) {
157+
fprintf(stderr, "tls_callback DLL_PROCESS_DETACH2\n");
158+
fflush(stderr);
146159
p = (dtor_obj **)TlsGetValue(tls_dtors_slot);
147160
run_dtor_list(p);
148161
free(p);
@@ -151,17 +164,31 @@ static void WINAPI tls_callback(HANDLE hDllHandle, DWORD dwReason, LPVOID __UNUS
151164
* thread local atexit callback, to make sure they don't run when
152165
* exiting the process with _exit or ExitProcess. */
153166
run_dtor_list(&global_dtors);
167+
fprintf(stderr, "tls_callback DLL_PROCESS_DETACH3\n");
168+
fflush(stderr);
154169
TlsFree(tls_dtors_slot);
155170
}
171+
fprintf(stderr, "tls_callback DLL_PROCESS_DETACH4\n");
172+
fflush(stderr);
156173
if (inited == 1) {
157174
inited = 0;
175+
fprintf(stderr, "tls_callback DLL_PROCESS_DETACH5\n");
176+
fflush(stderr);
158177
DeleteCriticalSection(&lock);
178+
fprintf(stderr, "tls_callback DLL_PROCESS_DETACH6\n");
179+
fflush(stderr);
159180
}
181+
fprintf(stderr, "tls_callback DLL_PROCESS_DETACH7\n");
182+
fflush(stderr);
160183
break;
161184
case DLL_THREAD_ATTACH:
185+
fprintf(stderr, "tls_callback DLL_THREAD_ATTACH\n");
186+
fflush(stderr);
162187
break;
163188
case DLL_THREAD_DETACH:
164189
p = (dtor_obj **)TlsGetValue(tls_dtors_slot);
190+
fprintf(stderr, "tls_callback DLL_THREAD_DETACH\n");
191+
fflush(stderr);
165192
run_dtor_list(p);
166193
free(p);
167194
TlsSetValue(tls_dtors_slot, NULL);

mingw-w64-crt/crt/tlssup.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ __dyn_tls_init (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
7979
_PVFV *pfunc;
8080
uintptr_t ps;
8181

82+
fprintf(stderr, "__dyn_tls_init reason %d\n", dwReason);
83+
fflush(stderr);
8284
/* We don't let us trick here. */
8385
if (_CRT_MT != 2)
8486
_CRT_MT = 2;
@@ -141,6 +143,8 @@ __dyn_tls_dtor (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
141143
int i;
142144
#endif
143145

146+
fprintf(stderr, "__dyn_tls_dtor reason %d\n", dwReason);
147+
fflush(stderr);
144148
if (dwReason != DLL_THREAD_DETACH && dwReason != DLL_PROCESS_DETACH)
145149
return TRUE;
146150
/* As TLS variables are detroyed already by DLL_THREAD_DETACH

mingw-w64-crt/crt/tlsthrd.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#endif
1717
#include <windows.h>
1818
#include <stdlib.h>
19+
#include <stdio.h>
1920

2021
extern void __cdecl __MINGW_NOTHROW _fpreset (void);
2122
WINBOOL __mingw_TLScallback (HANDLE hDllHandle, DWORD reason, LPVOID reserved);
@@ -126,11 +127,15 @@ __mingw_TLScallback (HANDLE __UNUSED_PARAM(hDllHandle),
126127
switch (reason)
127128
{
128129
case DLL_PROCESS_ATTACH:
130+
fprintf(stderr, "__mingw_TLScallback DLL_PROCESS_ATTACH\n");
131+
fflush(stderr);
129132
if (__mingwthr_cs_init == 0)
130133
InitializeCriticalSection (&__mingwthr_cs);
131134
__mingwthr_cs_init = 1;
132135
break;
133136
case DLL_PROCESS_DETACH:
137+
fprintf(stderr, "__mingw_TLScallback DLL_PROCESS_DETACH\n");
138+
fflush(stderr);
134139
__mingwthr_run_key_dtors();
135140
if (__mingwthr_cs_init == 1)
136141
{
@@ -147,9 +152,13 @@ __mingw_TLScallback (HANDLE __UNUSED_PARAM(hDllHandle),
147152
}
148153
break;
149154
case DLL_THREAD_ATTACH:
155+
fprintf(stderr, "__mingw_TLScallback DLL_THREAD_ATTACH\n");
156+
fflush(stderr);
150157
_fpreset();
151158
break;
152159
case DLL_THREAD_DETACH:
160+
fprintf(stderr, "__mingw_TLScallback DLL_THREAD_DETACH\n");
161+
fflush(stderr);
153162
__mingwthr_run_key_dtors();
154163
break;
155164
}

mingw-w64-libraries/winpthreads/src/thread.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,7 @@ __dyn_tls_pthread (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
432432

433433
if (dwReason == DLL_PROCESS_DETACH)
434434
{
435+
fprintf(stderr, "__dyn_tls_pthread DLL_PROCESS_DETACH\n"); fflush(stderr);
435436
#if defined(USE_VEH_FOR_MSC_SETTHREADNAME)
436437
if (lpreserved == NULL && SetThreadName_VEH_handle != NULL)
437438
{
@@ -444,6 +445,7 @@ __dyn_tls_pthread (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
444445
}
445446
else if (dwReason == DLL_PROCESS_ATTACH)
446447
{
448+
fprintf(stderr, "__dyn_tls_pthread DLL_PROCESS_ATTACH\n"); fflush(stderr);
447449
#if defined(USE_VEH_FOR_MSC_SETTHREADNAME)
448450
if (AddVectoredExceptionHandlerFuncPtr != NULL)
449451
SetThreadName_VEH_handle = AddVectoredExceptionHandlerFuncPtr (1, &SetThreadName_VEH);
@@ -454,6 +456,7 @@ __dyn_tls_pthread (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
454456
}
455457
else if (dwReason == DLL_THREAD_DETACH)
456458
{
459+
fprintf(stderr, "__dyn_tls_pthread DLL_THREAD_DETACH\n"); fflush(stderr);
457460
if (_pthread_tls != 0xffffffff)
458461
t = (_pthread_v *)TlsGetValue(_pthread_tls);
459462
if (t && t->thread_noposix != 0)
@@ -971,6 +974,7 @@ _pthread_cleanup_dest (pthread_t t)
971974
{
972975
_pthread_v *tv;
973976
unsigned int i, j;
977+
fprintf(stderr, "_pthread_cleanup_dest\n"); fflush(stderr);
974978

975979
if (!t)
976980
return;
@@ -1110,6 +1114,7 @@ pthread_exit (void *res)
11101114

11111115
id->ret_arg = res;
11121116

1117+
fprintf(stderr, "pthread_exit\n");
11131118
_pthread_cleanup_dest (id->x);
11141119
if (id->thread_noposix == 0)
11151120
longjmp(id->jb, 1);
@@ -1567,6 +1572,7 @@ pthread_create_wrapper (void *args)
15671572
pthread_mutex_lock (&mtx_pthr_locked);
15681573
tv->ret_arg = (void*) trslt;
15691574
/* Clean up destructors */
1575+
fprintf(stderr, "pthread_create_wrapper calling cleanup\n");
15701576
_pthread_cleanup_dest(tv->x);
15711577
}
15721578
else

0 commit comments

Comments
 (0)