diff options
author | Vicent Marti <tanoku@gmail.com> | 2011-03-17 22:11:35 +0200 |
---|---|---|
committer | Vicent Marti <tanoku@gmail.com> | 2011-03-17 22:16:54 +0200 |
commit | cb3e1334e8a5c3003fa0419442fc06d45508ac31 (patch) | |
tree | 6be2facd0014fff4a4769b6a6a082c722c03ad87 /src/thread-utils.h | |
parent | 12d67a2a4e7f673e6239ac8865dfe8cb6ddcae53 (diff) | |
download | libgit2-threadsafe.tar.gz |
Fix the threading implementationthreadsafe
Diffstat (limited to 'src/thread-utils.h')
-rw-r--r-- | src/thread-utils.h | 58 |
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); |