10 #define FUNCS_PER_NODE 30
12 typedef struct TlsDtorNode
{
14 struct TlsDtorNode
*next
;
15 _PVFV funcs
[FUNCS_PER_NODE
];
20 _CRTALLOC(".tls") char _tls_start
= 0;
21 _CRTALLOC(".tls$ZZZ") char _tls_end
= 0;
23 _CRTALLOC(".CRT$XLA") PIMAGE_TLS_CALLBACK __xl_a
= 0;
24 _CRTALLOC(".CRT$XLZ") PIMAGE_TLS_CALLBACK __xl_z
= 0;
27 _CRTALLOC(".rdata$T") const IMAGE_TLS_DIRECTORY64 _tls_used
= {
28 (ULONGLONG
) &_tls_start
, (ULONGLONG
) &_tls_end
, (ULONGLONG
) &_tls_index
,
29 (ULONGLONG
) (&__xl_a
+1), (ULONG
) 0, (ULONG
) 0
32 _CRTALLOC(".rdata$T") const IMAGE_TLS_DIRECTORY _tls_used
= {
33 (ULONG
)(ULONG_PTR
) &_tls_start
, (ULONG
)(ULONG_PTR
) &_tls_end
,
34 (ULONG
)(ULONG_PTR
) &_tls_index
, (ULONG
)(ULONG_PTR
) (&__xl_a
+1),
40 #ifdef HAVE_ATTRIBUTE_THREAD
41 #define __CRT_THREAD __declspec(thread)
47 static _CRTALLOC(".CRT$XDA") _PVFV __xd_a
= 0;
48 static _CRTALLOC(".CRT$XDZ") _PVFV __xd_z
= 0;
49 static __CRT_THREAD TlsDtorNode
*dtor_list
;
50 static __CRT_THREAD TlsDtorNode dtor_list_head
;
53 __dyn_tls_init (HANDLE hDllHandle
, DWORD dwReason
, LPVOID lpreserved
)
57 //DbgPrint("__dyn_tls_init: hDllHandle %p, dwReason %d\n", hDllHandle,dwReason);
58 if (dwReason
!= DLL_THREAD_ATTACH
)
61 for (pfunc
= &__xd_a
+ 1; pfunc
!= &__xd_z
; ++pfunc
)
63 //DbgPrint("pfunc at %p\n",pfunc);
71 const PIMAGE_TLS_CALLBACK __dyn_tls_init_callback
= (const PIMAGE_TLS_CALLBACK
) __dyn_tls_init
;
72 _CRTALLOC(".CRT$XLC") PIMAGE_TLS_CALLBACK __xl_c
= (PIMAGE_TLS_CALLBACK
) __dyn_tls_init
;
75 __tlregdtor (_PVFV func
)
77 //DbgPrint("__tlregdtor: func %p\n",func);
79 if (dtor_list
== NULL
)
81 dtor_list
= &dtor_list_head
;
82 dtor_list_head
.count
= 0;
84 else if (dtor_list
->count
== FUNCS_PER_NODE
)
86 TlsDtorNode
*pnode
= (TlsDtorNode
*) malloc (sizeof (TlsDtorNode
));
90 pnode
->next
= dtor_list
;
95 dtor_list
->funcs
[dtor_list
->count
++] = func
;
100 __dyn_tls_dtor (HANDLE hDllHandle
, DWORD dwReason
, LPVOID lpreserved
)
103 TlsDtorNode
*pnode
, *pnext
;
106 //DbgPrint("__dyn_tls_dtor: hDllHandle %p, dwReason %d\n");
107 if (dwReason
!= DLL_THREAD_DETACH
&& dwReason
!= DLL_PROCESS_DETACH
)
110 for (pnode
= dtor_list
; pnode
!= NULL
; pnode
= pnext
)
112 for (i
= pnode
->count
- 1; i
>= 0; --i
)
114 if (pnode
->funcs
[i
] != NULL
)
115 (*pnode
->funcs
[i
])();
119 free ((void *) pnode
);
124 _CRTALLOC(".CRT$XLD") PIMAGE_TLS_CALLBACK __xl_d
= (PIMAGE_TLS_CALLBACK
) __dyn_tls_dtor
;
127 int mingw_initltsdrot_force
= 0;
128 int mingw_initltsdyn_force
=0;
129 int mingw_initltssuo_force
= 0;