Fix the threading implementation
diff --git a/src/cache.c b/src/cache.c
index cabd286..5a9b841 100644
--- a/src/cache.c
+++ b/src/cache.c
@@ -39,12 +39,12 @@
GIT_INLINE(void) cached_obj_incref(git_cached_obj *obj)
{
- obj->refcount++;
+ git_atomic_inc(&obj->refcount);
}
GIT_INLINE(void) cached_obj_decref(git_cached_obj *obj, git_cached_obj_freeptr free_obj)
{
- if (--obj->refcount == 0)
+ if (git_atomic_dec(&obj->refcount) == 0)
free_obj(obj);
}
diff --git a/src/cache.h b/src/cache.h
index a84267b..9f525e6 100644
--- a/src/cache.h
+++ b/src/cache.h
@@ -11,7 +11,7 @@
typedef struct {
git_oid oid;
- unsigned int refcount;
+ git_atomic refcount;
} git_cached_obj;
typedef struct {
diff --git a/src/thread-utils.h b/src/thread-utils.h
index ee26ad2..1cf0e34 100644
--- a/src/thread-utils.h
+++ b/src/thread-utils.h
@@ -1,6 +1,18 @@
#ifndef INCLUDE_thread_utils_h__
#define INCLUDE_thread_utils_h__
+
+
+/* Common operations even if threading has been disabled */
+typedef struct {
+ volatile int val;
+} git_atomic;
+
+static inline void git_atomic_set(git_atomic *a, int val)
+{
+ a->val = val;
+}
+
#ifdef GIT_THREADS
#define git_thread pthread_t
@@ -16,13 +28,35 @@
#define git_mutex_unlock(a) pthread_mutex_unlock(a)
#define git_mutex_free(a) pthread_mutex_destroy(a)
-/* Pthreads condition vars */
-#define git_cond pthread_cond_t
-#define git_cond_init(c, a) pthread_cond_init(c, a)
-#define git_cond_free(c) pthread_cond_destroy(c)
-#define git_cond_wait(c, l) pthread_cond_wait(c, l)
-#define git_cond_signal(c) pthread_cond_signal(c)
-#define git_cond_broadcast(c) pthread_cond_broadcast(c)
+/* Pthreads condition vars -- disabled by now */
+#define git_cond unsigned int //pthread_cond_t
+#define git_cond_init(c, a) (void)0 //pthread_cond_init(c, a)
+#define git_cond_free(c) (void)0 //pthread_cond_destroy(c)
+#define git_cond_wait(c, l) (void)0 //pthread_cond_wait(c, l)
+#define git_cond_signal(c) (void)0 //pthread_cond_signal(c)
+#define git_cond_broadcast(c) (void)0 //pthread_cond_broadcast(c)
+
+static inline int git_atomic_inc(git_atomic *a)
+{
+#ifdef __GNUC__
+ return __sync_add_and_fetch(&a->val, 1);
+#elif defined(_MSC_VER)
+ return InterlockedIncrement(&a->val);
+#else
+# error "Unsupported architecture for atomic operations"
+#endif
+}
+
+static inline int git_atomic_dec(git_atomic *a)
+{
+#ifdef __GNUC__
+ return __sync_sub_and_fetch(&a->val, 1);
+#elif defined(_MSC_VER)
+ return InterlockedDecrement(&a->val);
+#else
+# error "Unsupported architecture for atomic operations"
+#endif
+}
#else
@@ -47,6 +81,16 @@
#define git_cond_signal(c) (void)0
#define git_cond_broadcast(c) (void)0
+static inline int git_atomic_inc(git_atomic *a)
+{
+ return ++a->val;
+}
+
+static inline int git_atomic_dec(git_atomic *a)
+{
+ return --a->val;
+}
+
#endif
extern int git_online_cpus(void);
diff --git a/src/win32/pthread.c b/src/win32/pthread.c
index fffff81..f47364a 100644
--- a/src/win32/pthread.c
+++ b/src/win32/pthread.c
@@ -36,17 +36,27 @@
return *thread ? GIT_SUCCESS : GIT_EOSERR;
}
-int pthread_cond_signal(pthread_cond_t *cond)
+int pthread_join(pthread_t thread, void **value_ptr)
{
- WakeConditionVariable(cond);
+ int ret;
+ ret = WaitForSingleObject(thread, INFINITE);
+ if (ret && value_ptr)
+ GetExitCodeThread(thread, (void*) value_ptr);
+ return -(!!ret);
+}
+
+int pthread_mutex_init(pthread_mutex_t *GIT_RESTRICT mutex,
+ const pthread_mutexattr_t *GIT_RESTRICT GIT_UNUSED(mutexattr))
+{
+ GIT_UNUSED_ARG(mutexattr);
+ InitializeCriticalSection(mutex);
return 0;
}
-int pthread_cond_wait(pthread_cond_t *GIT_RESTRICT cond,
- pthread_mutex_t *GIT_RESTRICT mutex)
+int pthread_mutex_destroy(pthread_mutex_t *mutex)
{
int ret;
- ret = SleepConditionVariableCS(cond, mutex, INFINITE);
+ ret = CloseHandle(mutex);
return -(!ret);
}
@@ -62,50 +72,6 @@
return 0;
}
-int pthread_join(pthread_t thread, void **value_ptr)
-{
- int ret;
- ret = WaitForSingleObject(thread, INFINITE);
- if (ret && value_ptr)
- GetExitCodeThread(thread, (void*) value_ptr);
- return -(!!ret);
-}
-
-int pthread_cond_broadcast(pthread_cond_t *cond)
-{
- WakeAllConditionVariable(cond);
- return 0;
-}
-
-int pthread_mutex_destroy(pthread_mutex_t *mutex)
-{
- int ret;
- ret = CloseHandle(mutex);
- return -(!ret);
-}
-
-int pthread_cond_destroy(pthread_cond_t *GIT_UNUSED(cond))
-{
- GIT_UNUSED_ARG(cond);
- return 0;
-}
-
-int pthread_cond_init(pthread_cond_t *GIT_RESTRICT cond,
- const pthread_condattr_t *GIT_RESTRICT GIT_UNUSED(condattr))
-{
- GIT_UNUSED_ARG(condattr);
- InitializeConditionVariable(cond);
- return 0;
-}
-
-int pthread_mutex_init(pthread_mutex_t *GIT_RESTRICT mutex,
- const pthread_mutexattr_t *GIT_RESTRICT GIT_UNUSED(mutexattr))
-{
- GIT_UNUSED_ARG(mutexattr);
- InitializeCriticalSection(mutex);
- return 0;
-}
-
int pthread_num_processors_np(void)
{
DWORD_PTR p, s;
diff --git a/src/win32/pthread.h b/src/win32/pthread.h
index ff694e3..10949f1 100644
--- a/src/win32/pthread.h
+++ b/src/win32/pthread.h
@@ -40,7 +40,6 @@
typedef int pthread_condattr_t;
typedef int pthread_attr_t;
typedef CRITICAL_SECTION pthread_mutex_t;
-typedef CONDITION_VARIABLE pthread_cond_t;
typedef HANDLE pthread_t;
#define PTHREAD_MUTEX_INITIALIZER {(void*)-1};
@@ -56,12 +55,6 @@
int pthread_mutex_lock(pthread_mutex_t *);
int pthread_mutex_unlock(pthread_mutex_t *);
-int pthread_cond_init(pthread_cond_t *GIT_RESTRICT, const pthread_condattr_t *GIT_RESTRICT);
-int pthread_cond_destroy(pthread_cond_t *);
-int pthread_cond_broadcast(pthread_cond_t *);
-int pthread_cond_signal(pthread_cond_t *);
-int pthread_cond_wait(pthread_cond_t *GIT_RESTRICT, pthread_mutex_t *GIT_RESTRICT);
-
int pthread_num_processors_np(void);
-#endif
\ No newline at end of file
+#endif
diff --git a/tests/t13-threads.c b/tests/t13-threads.c
index 7da1076..62ca73a 100644
--- a/tests/t13-threads.c
+++ b/tests/t13-threads.c
@@ -37,8 +37,6 @@
git_cache *cache = (git_cache*)data;
unsigned int num;
-
-
}
BEGIN_TEST(cache0, "run several threads polling the cache at the same time")