Unverified Commit 36bfc27a by Edward Thomson Committed by GitHub

Merge pull request #5314 from pks-t/pks/dll-main-removal

global: convert to fiber-local storage to fix exit races
parents d298f9b2 5c6180b5
...@@ -141,14 +141,21 @@ static void shutdown_common(void) ...@@ -141,14 +141,21 @@ static void shutdown_common(void)
*/ */
#if defined(GIT_THREADS) && defined(GIT_WIN32) #if defined(GIT_THREADS) && defined(GIT_WIN32)
static DWORD _tls_index; static DWORD _fls_index;
static volatile LONG _mutex = 0; static volatile LONG _mutex = 0;
static void WINAPI fls_free(void *st)
{
git__global_state_cleanup(st);
git__free(st);
}
static int synchronized_threads_init(void) static int synchronized_threads_init(void)
{ {
int error; int error;
_tls_index = TlsAlloc(); if ((_fls_index = FlsAlloc(fls_free)) == FLS_OUT_OF_INDEXES)
return -1;
git_threads_init(); git_threads_init();
...@@ -190,9 +197,7 @@ int git_libgit2_shutdown(void) ...@@ -190,9 +197,7 @@ int git_libgit2_shutdown(void)
if ((ret = git_atomic_dec(&git__n_inits)) == 0) { if ((ret = git_atomic_dec(&git__n_inits)) == 0) {
shutdown_common(); shutdown_common();
git__free_tls_data(); FlsFree(_fls_index);
TlsFree(_tls_index);
git_mutex_free(&git__mwindow_mutex); git_mutex_free(&git__mwindow_mutex);
#if defined(GIT_MSVC_CRTDBG) #if defined(GIT_MSVC_CRTDBG)
...@@ -213,7 +218,7 @@ git_global_st *git__global_state(void) ...@@ -213,7 +218,7 @@ git_global_st *git__global_state(void)
assert(git_atomic_get(&git__n_inits) > 0); assert(git_atomic_get(&git__n_inits) > 0);
if ((ptr = TlsGetValue(_tls_index)) != NULL) if ((ptr = FlsGetValue(_fls_index)) != NULL)
return ptr; return ptr;
ptr = git__calloc(1, sizeof(git_global_st)); ptr = git__calloc(1, sizeof(git_global_st));
...@@ -222,43 +227,10 @@ git_global_st *git__global_state(void) ...@@ -222,43 +227,10 @@ git_global_st *git__global_state(void)
git_buf_init(&ptr->error_buf, 0); git_buf_init(&ptr->error_buf, 0);
TlsSetValue(_tls_index, ptr); FlsSetValue(_fls_index, ptr);
return ptr; return ptr;
} }
/**
* Free the TLS data associated with this thread.
* This should only be used by the thread as it
* is exiting.
*/
void git__free_tls_data(void)
{
void *ptr = TlsGetValue(_tls_index);
if (!ptr)
return;
git__global_state_cleanup(ptr);
git__free(ptr);
TlsSetValue(_tls_index, NULL);
}
BOOL WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, LPVOID lpvReserved)
{
GIT_UNUSED(hInstDll);
GIT_UNUSED(lpvReserved);
/* This is how Windows lets us know our thread is being shut down */
if (fdwReason == DLL_THREAD_DETACH) {
git__free_tls_data();
}
/*
* Windows pays attention to this during library loading. We don't do anything
* so we trivially succeed.
*/
return TRUE;
}
#elif defined(GIT_THREADS) && defined(_POSIX_THREADS) #elif defined(GIT_THREADS) && defined(_POSIX_THREADS)
static pthread_key_t _tls_key; static pthread_key_t _tls_key;
......
...@@ -35,8 +35,6 @@ typedef void (*git_global_shutdown_fn)(void); ...@@ -35,8 +35,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_tls_data(void);
extern const char *git_libgit2__user_agent(void); extern const char *git_libgit2__user_agent(void);
extern const char *git_libgit2__ssl_ciphers(void); extern const char *git_libgit2__ssl_ciphers(void);
......
...@@ -32,8 +32,6 @@ static DWORD WINAPI git_win32__threadproc(LPVOID lpParameter) ...@@ -32,8 +32,6 @@ static DWORD WINAPI git_win32__threadproc(LPVOID lpParameter)
thread->result = thread->proc(thread->param); thread->result = thread->proc(thread->param);
git__free_tls_data();
return CLEAN_THREAD_EXIT; return CLEAN_THREAD_EXIT;
} }
...@@ -103,9 +101,6 @@ void git_thread_exit(void *value) ...@@ -103,9 +101,6 @@ void git_thread_exit(void *value)
{ {
assert(GIT_GLOBAL->current_thread); assert(GIT_GLOBAL->current_thread);
GIT_GLOBAL->current_thread->result = value; GIT_GLOBAL->current_thread->result = value;
git__free_tls_data();
ExitThread(CLEAN_THREAD_EXIT); ExitThread(CLEAN_THREAD_EXIT);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment