mirror of
https://git.proxmox.com/git/libgit2
synced 2025-06-22 19:19:41 +00:00
atomic: Add an atomic type for 64-bit operations
This commit is contained in:
parent
d08dd728a8
commit
f9774eea3a
@ -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)
|
|||||||
#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(
|
|||||||
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)
|
|||||||
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(
|
|||||||
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
|
||||||
|
Loading…
Reference in New Issue
Block a user