summaryrefslogtreecommitdiff
path: root/src/thread-utils.h
diff options
context:
space:
mode:
authorVicent Marti <tanoku@gmail.com>2011-03-17 22:11:35 +0200
committerVicent Marti <tanoku@gmail.com>2011-03-17 22:16:54 +0200
commitcb3e1334e8a5c3003fa0419442fc06d45508ac31 (patch)
tree6be2facd0014fff4a4769b6a6a082c722c03ad87 /src/thread-utils.h
parent12d67a2a4e7f673e6239ac8865dfe8cb6ddcae53 (diff)
downloadlibgit2-threadsafe.tar.gz
Fix the threading implementationthreadsafe
Diffstat (limited to 'src/thread-utils.h')
-rw-r--r--src/thread-utils.h58
1 files changed, 51 insertions, 7 deletions
diff --git a/src/thread-utils.h b/src/thread-utils.h
index ee26ad251..1cf0e3407 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);