Attempt to fix Windows TLS memory leak.

This commit is contained in:
Jeff Hostetler 2015-04-17 09:30:22 -04:00
parent c332bb70cd
commit 55c5f756d8
3 changed files with 17 additions and 5 deletions

View File

@ -270,13 +270,21 @@ git_global_st *git__global_state(void)
return ptr; return ptr;
} }
BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, LPVOID reserved) void git__free_thread_global_state(void)
{ {
if (reason == DLL_THREAD_DETACH) {
void *ptr = TlsGetValue(_tls_index); void *ptr = TlsGetValue(_tls_index);
if (!ptr)
return;
git__global_state_cleanup(ptr); git__global_state_cleanup(ptr);
git__free(ptr); git__free(ptr);
} TlsSetValue(_tls_index, NULL);
}
BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, LPVOID reserved)
{
if (reason == DLL_THREAD_DETACH)
git__free_thread_global_state();
return TRUE; return TRUE;
} }

View File

@ -32,4 +32,6 @@ typedef void (*git_global_shutdown_fn)(void);
extern void git__on_shutdown(git_global_shutdown_fn callback); extern void git__on_shutdown(git_global_shutdown_fn callback);
extern void git__free_thread_global_state(void);
#endif #endif

View File

@ -20,6 +20,8 @@ static DWORD WINAPI git_win32__threadproc(LPVOID lpParameter)
thread->result = thread->proc(thread->param); thread->result = thread->proc(thread->param);
git__free_thread_global_state();
return CLEAN_THREAD_EXIT; return CLEAN_THREAD_EXIT;
} }