diff options
| author | Patrick Steinhardt <ps@pks.im> | 2016-11-04 18:18:46 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-11-04 18:18:46 +0100 |
| commit | 5fe5557e8a8d3fd6a4617c2d8c863c1f62848020 (patch) | |
| tree | 33d5f25050b1f60ab88ac5165ced639a45a1e76b /src | |
| parent | 6e2fab9eded4c815d52ff812671fd7a601ef19d6 (diff) | |
| parent | 1c33ecc4456186f4cc6570876ed5c47031b7ef1b (diff) | |
| download | libgit2-5fe5557e8a8d3fd6a4617c2d8c863c1f62848020.tar.gz | |
Merge pull request #3974 from libgit2/pks/synchronize-shutdown
global: synchronize initialization and shutdown with pthreads
Diffstat (limited to 'src')
| -rw-r--r-- | src/global.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/src/global.c b/src/global.c index 45b1ab8f6..e2ad8fe71 100644 --- a/src/global.c +++ b/src/global.c @@ -247,6 +247,7 @@ BOOL WINAPI DllMain(HINSTANCE hInstDll, DWORD fdwReason, LPVOID lpvReserved) #elif defined(GIT_THREADS) && defined(_POSIX_THREADS) static pthread_key_t _tls_key; +static pthread_mutex_t _init_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_once_t _once_init = PTHREAD_ONCE_INIT; int init_error = 0; @@ -268,12 +269,19 @@ static void init_once(void) int git_libgit2_init(void) { - int ret; + int ret, err; ret = git_atomic_inc(&git__n_inits); - pthread_once(&_once_init, init_once); - return init_error ? init_error : ret; + if ((err = pthread_mutex_lock(&_init_mutex)) != 0) + return err; + err = pthread_once(&_once_init, init_once); + err |= pthread_mutex_unlock(&_init_mutex); + + if (err || init_error) + return err | init_error; + + return ret; } int git_libgit2_shutdown(void) @@ -285,6 +293,9 @@ int git_libgit2_shutdown(void) if ((ret = git_atomic_dec(&git__n_inits)) != 0) return ret; + if ((ret = pthread_mutex_lock(&_init_mutex)) != 0) + return ret; + /* Shut down any subsystems that have global state */ shutdown_common(); @@ -298,6 +309,9 @@ int git_libgit2_shutdown(void) git_mutex_free(&git__mwindow_mutex); _once_init = new_once; + if ((ret = pthread_mutex_unlock(&_init_mutex)) != 0) + return ret; + return 0; } @@ -327,7 +341,7 @@ int git_libgit2_init(void) { int ret; - /* Only init SSL the first time */ + /* Only init subsystems the first time */ if ((ret = git_atomic_inc(&git__n_inits)) != 1) return ret; @@ -345,6 +359,7 @@ int git_libgit2_shutdown(void) if ((ret = git_atomic_dec(&git__n_inits)) == 0) { shutdown_common(); git__global_state_cleanup(&__state); + memset(&__state, 0, sizeof(__state)); } return ret; |
