summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell Belfer <rb@github.com>2014-03-14 14:51:04 -0700
committerRussell Belfer <rb@github.com>2014-04-17 14:43:46 -0700
commit3816debc13e8d5b96ad40be95a09fe67f6fa5a96 (patch)
treec72a5307dbe85b972d97f69e66b1dfc5bbe08981
parent52bb0476a8ad462c56b1d2c68b6d5f20f947ee50 (diff)
downloadlibgit2-3816debc13e8d5b96ad40be95a09fe67f6fa5a96.tar.gz
Fix threading tests when threads disabled
-rw-r--r--src/global.c20
-rw-r--r--tests/threads/diff.c3
2 files changed, 12 insertions, 11 deletions
diff --git a/src/global.c b/src/global.c
index c26b4b311..15baf1eb8 100644
--- a/src/global.c
+++ b/src/global.c
@@ -16,8 +16,9 @@ git_mutex git__mwindow_mutex;
#define MAX_SHUTDOWN_CB 8
-git_global_shutdown_fn git__shutdown_callbacks[MAX_SHUTDOWN_CB];
-git_atomic git__n_shutdown_callbacks;
+static git_global_shutdown_fn git__shutdown_callbacks[MAX_SHUTDOWN_CB];
+static git_atomic git__n_shutdown_callbacks;
+static git_atomic git__n_inits;
void git__on_shutdown(git_global_shutdown_fn callback)
{
@@ -74,7 +75,6 @@ static void git__shutdown(void)
static DWORD _tls_index;
static DWORD _mutex = 0;
-static DWORD _n_inits = 0;
static int synchronized_threads_init()
{
@@ -101,7 +101,7 @@ int git_threads_init(void)
while (InterlockedCompareExchange(&_mutex, 1, 0)) { Sleep(0); }
/* Only do work on a 0 -> 1 transition of the refcount */
- if (1 == ++_n_inits)
+ if (1 == git_atomic_inc(&git__n_inits))
error = synchronized_threads_init();
/* Exit the lock */
@@ -124,7 +124,7 @@ void git_threads_shutdown(void)
while (InterlockedCompareExchange(&_mutex, 1, 0)) { Sleep(0); }
/* Only do work on a 1 -> 0 transition of the refcount */
- if (0 == --_n_inits)
+ if (0 == git_atomic_dec(&git__n_inits))
synchronized_threads_shutdown();
/* Exit the lock */
@@ -135,7 +135,7 @@ git_global_st *git__global_state(void)
{
void *ptr;
- assert(_n_inits);
+ assert(git_atomic_get(&git__n_inits) > 0);
if ((ptr = TlsGetValue(_tls_index)) != NULL)
return ptr;
@@ -153,7 +153,6 @@ git_global_st *git__global_state(void)
static pthread_key_t _tls_key;
static pthread_once_t _once_init = PTHREAD_ONCE_INIT;
-static git_atomic git__n_inits;
int init_error = 0;
static void cb__free_status(void *st)
@@ -204,7 +203,7 @@ git_global_st *git__global_state(void)
{
void *ptr;
- assert(git__n_inits.val);
+ assert(git_atomic_get(&git__n_inits) > 0);
if ((ptr = pthread_getspecific(_tls_key)) != NULL)
return ptr;
@@ -224,14 +223,15 @@ static git_global_st __state;
int git_threads_init(void)
{
- /* noop */
+ git_atomic_inc(&git__n_inits);
return 0;
}
void git_threads_shutdown(void)
{
/* Shut down any subsystems that have global state */
- git__shutdown();
+ if (0 == git_atomic_dec(&git__n_inits))
+ git__shutdown();
}
git_global_st *git__global_state(void)
diff --git a/tests/threads/diff.c b/tests/threads/diff.c
index 7f10a699d..5565c4bf1 100644
--- a/tests/threads/diff.c
+++ b/tests/threads/diff.c
@@ -18,11 +18,12 @@ static void run_in_parallel(
int r, t, *id = git__calloc(threads, sizeof(int));
#ifdef GIT_THREADS
git_thread *th = git__calloc(threads, sizeof(git_thread));
+ cl_assert(th != NULL);
#else
void *th = NULL;
#endif
- cl_assert(id != NULL && th != NULL);
+ cl_assert(id != NULL);
for (r = 0; r < repeats; ++r) {
_repo = cl_git_sandbox_reopen(); /* reopen sandbox to flush caches */