Commit f9774eea by Vicent Marti

atomic: Add an atomic type for 64-bit operations

parent d08dd728
...@@ -18,6 +18,14 @@ typedef struct { ...@@ -18,6 +18,14 @@ typedef struct {
#endif #endif
} git_atomic; } git_atomic;
typedef struct {
#if defined(GIT_WIN32)
__int64 val;
#else
int64_t val;
#endif
} git_atomic64;
GIT_INLINE(void) git_atomic_set(git_atomic *a, int val) GIT_INLINE(void) git_atomic_set(git_atomic *a, int val)
{ {
a->val = val; a->val = val;
...@@ -57,6 +65,17 @@ GIT_INLINE(int) git_atomic_inc(git_atomic *a) ...@@ -57,6 +65,17 @@ GIT_INLINE(int) git_atomic_inc(git_atomic *a)
#endif #endif
} }
GIT_INLINE(int) git_atomic_add(git_atomic *a, int32_t addend)
{
#if defined(GIT_WIN32)
return _InterlockedExchangeAdd(&a->val, addend);
#elif defined(__GNUC__)
return __sync_add_and_fetch(&a->val, addend);
#else
# error "Unsupported architecture for atomic operations"
#endif
}
GIT_INLINE(int) git_atomic_dec(git_atomic *a) GIT_INLINE(int) git_atomic_dec(git_atomic *a)
{ {
#if defined(GIT_WIN32) #if defined(GIT_WIN32)
...@@ -82,6 +101,17 @@ GIT_INLINE(void *) git___compare_and_swap( ...@@ -82,6 +101,17 @@ GIT_INLINE(void *) git___compare_and_swap(
return (foundval == oldval) ? oldval : newval; return (foundval == oldval) ? oldval : newval;
} }
GIT_INLINE(int) git_atomic64_add(git_atomic64 *a, int64_t addend)
{
#if defined(GIT_WIN32)
return _InterlockedExchangeAdd64(&a->val, addend);
#elif defined(__GNUC__)
return __sync_add_and_fetch(&a->val, addend);
#else
# error "Unsupported architecture for atomic operations"
#endif
}
#else #else
#define git_thread unsigned int #define git_thread unsigned int
...@@ -110,6 +140,12 @@ GIT_INLINE(int) git_atomic_inc(git_atomic *a) ...@@ -110,6 +140,12 @@ GIT_INLINE(int) git_atomic_inc(git_atomic *a)
return ++a->val; return ++a->val;
} }
GIT_INLINE(int) git_atomic_add(git_atomic *a, int32_t addend)
{
a->val += addend;
return a->val;
}
GIT_INLINE(int) git_atomic_dec(git_atomic *a) GIT_INLINE(int) git_atomic_dec(git_atomic *a)
{ {
return --a->val; return --a->val;
...@@ -125,6 +161,12 @@ GIT_INLINE(void *) git___compare_and_swap( ...@@ -125,6 +161,12 @@ GIT_INLINE(void *) git___compare_and_swap(
return oldval; return oldval;
} }
GIT_INLINE(int) git_atomic64_add(git_atomic64 *a, int64_t addend)
{
a->val += addend;
return a->val;
}
#endif #endif
/* Atomically replace oldval with newval /* Atomically replace oldval with newval
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment