msvcrt: Free memory allocated in TLS slot on module unload as well as thread exit.
This commit is contained in:
parent
eb81fa283b
commit
c20868e0a2
|
@ -60,13 +60,24 @@ static inline BOOL msvcrt_free_tls(void)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void msvcrt_free_tls_mem(void)
|
||||||
|
{
|
||||||
|
thread_data_t *tls = TlsGetValue(msvcrt_tls_index);
|
||||||
|
if (tls)
|
||||||
|
{
|
||||||
|
HeapFree(GetProcessHeap(),0,tls->efcvt_buffer);
|
||||||
|
HeapFree(GetProcessHeap(),0,tls->asctime_buffer);
|
||||||
|
HeapFree(GetProcessHeap(),0,tls->wasctime_buffer);
|
||||||
|
HeapFree(GetProcessHeap(),0,tls->strerror_buffer);
|
||||||
|
}
|
||||||
|
HeapFree(GetProcessHeap(), 0, tls);
|
||||||
|
}
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* Init
|
* Init
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
||||||
{
|
{
|
||||||
thread_data_t *tls;
|
|
||||||
|
|
||||||
TRACE("(%p, %s, %p) pid(%x), tid(%x), tls(%u)\n",
|
TRACE("(%p, %s, %p) pid(%x), tid(%x), tls(%u)\n",
|
||||||
hinstDLL, msvcrt_get_reason(fdwReason), lpvReserved,
|
hinstDLL, msvcrt_get_reason(fdwReason), lpvReserved,
|
||||||
GetCurrentProcessId(), GetCurrentThreadId(),
|
GetCurrentProcessId(), GetCurrentThreadId(),
|
||||||
|
@ -94,21 +105,13 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
||||||
msvcrt_free_console();
|
msvcrt_free_console();
|
||||||
msvcrt_free_args();
|
msvcrt_free_args();
|
||||||
msvcrt_free_signals();
|
msvcrt_free_signals();
|
||||||
|
msvcrt_free_tls_mem();
|
||||||
if (!msvcrt_free_tls())
|
if (!msvcrt_free_tls())
|
||||||
return FALSE;
|
return FALSE;
|
||||||
TRACE("finished process free\n");
|
TRACE("finished process free\n");
|
||||||
break;
|
break;
|
||||||
case DLL_THREAD_DETACH:
|
case DLL_THREAD_DETACH:
|
||||||
/* Free TLS */
|
msvcrt_free_tls_mem();
|
||||||
tls = TlsGetValue(msvcrt_tls_index);
|
|
||||||
if (tls)
|
|
||||||
{
|
|
||||||
HeapFree(GetProcessHeap(),0,tls->efcvt_buffer);
|
|
||||||
HeapFree(GetProcessHeap(),0,tls->asctime_buffer);
|
|
||||||
HeapFree(GetProcessHeap(),0,tls->wasctime_buffer);
|
|
||||||
HeapFree(GetProcessHeap(),0,tls->strerror_buffer);
|
|
||||||
}
|
|
||||||
HeapFree(GetProcessHeap(), 0, tls);
|
|
||||||
TRACE("finished thread free\n");
|
TRACE("finished thread free\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue