msvcrt: Free memory allocated in TLS slot on module unload as well as thread exit.

This commit is contained in:
Rob Shearman 2009-12-14 14:13:57 +00:00 committed by Alexandre Julliard
parent eb81fa283b
commit c20868e0a2
1 changed files with 15 additions and 12 deletions

View File

@ -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;
} }