Commit 038f0e1b by Patrick Steinhardt

global: reset global state on shutdown without threading

When threading is not enabled for libgit2, we keep global state
in a simple static variable. When libgit2 is shut down, we clean
up the global state by freeing the global state's dynamically
allocated memory. When libgit2 is built with threading, we
additionally free the thread-local storage and thus completely
remove the global state. In a non-threaded build, though, we
simply leave the global state as-is, which may result in an error
upon reinitializing libgit2.

Fix the issue by zeroing out the variable on a shutdown, thus
returning it to its initial state.
parent 59c6c286
...@@ -341,7 +341,7 @@ int git_libgit2_init(void) ...@@ -341,7 +341,7 @@ int git_libgit2_init(void)
{ {
int ret; int ret;
/* Only init SSL the first time */ /* Only init subsystems the first time */
if ((ret = git_atomic_inc(&git__n_inits)) != 1) if ((ret = git_atomic_inc(&git__n_inits)) != 1)
return ret; return ret;
...@@ -359,6 +359,7 @@ int git_libgit2_shutdown(void) ...@@ -359,6 +359,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__global_state_cleanup(&__state); git__global_state_cleanup(&__state);
memset(&__state, 0, sizeof(__state));
} }
return ret; return ret;
......
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