Fix the issues in git__on_shutdown
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
diff --git a/src/global.c b/src/global.c
index 15baf1e..a64dce9 100644
--- a/src/global.c
+++ b/src/global.c
@@ -23,7 +23,7 @@ static git_atomic git__n_inits;
void git__on_shutdown(git_global_shutdown_fn callback)
{
int count = git_atomic_inc(&git__n_shutdown_callbacks);
- assert(count <= MAX_SHUTDOWN_CB);
+ assert(count <= MAX_SHUTDOWN_CB && count > 0);
git__shutdown_callbacks[count - 1] = callback;
}
@@ -31,10 +31,12 @@ static void git__shutdown(void)
{
int pos;
- while ((pos = git_atomic_dec(&git__n_shutdown_callbacks)) >= 0) {
- if (git__shutdown_callbacks[pos])
- git__shutdown_callbacks[pos]();
- }
+ for (pos = git_atomic_get(&git__n_shutdown_callbacks); pos > 0; pos = git_atomic_dec(&git__n_shutdown_callbacks))
+ if (git__shutdown_callbacks[pos - 1]) {
+ git__shutdown_callbacks[pos - 1]();
+ git__shutdown_callbacks[pos - 1] = NULL;
+ }
+
}
/**
diff --git a/src/sysdir.c b/src/sysdir.c
index e0c24f3..cd94a8b 100644
--- a/src/sysdir.c
+++ b/src/sysdir.c
@@ -90,6 +90,8 @@ void git_sysdir_global_shutdown(void)
int i;
for (i = 0; i < GIT_SYSDIR__MAX; ++i)
git_buf_free(&git_sysdir__dirs[i]);
+
+ git_sysdir__dirs_shutdown_set = 0;
}
static int git_sysdir_check_selector(git_sysdir_t which)