27 static int Increment(
volatile int* i) {
28 return ::InterlockedIncrement(
reinterpret_cast<volatile LONG*
>(i));
30 static int Decrement(
volatile int* i) {
31 return ::InterlockedDecrement(
reinterpret_cast<volatile LONG*
>(i));
33 static int AcquireLoad(
volatile const int* i) {
return *i; }
34 static void ReleaseStore(
volatile int* i,
int value) { *i = value; }
35 static int CompareAndSwap(
volatile int* i,
int old_value,
int new_value) {
36 return ::InterlockedCompareExchange(
reinterpret_cast<volatile LONG*
>(i),
37 new_value, old_value);
41 static T* AcquireLoadPtr(T*
volatile* ptr) {
45 static T* CompareAndSwapPtr(T*
volatile* ptr, T* old_value, T* new_value) {
46 return static_cast<T*
>(::InterlockedCompareExchangePointer(
47 reinterpret_cast<PVOID volatile*
>(ptr), new_value, old_value));
50 static int Increment(
volatile int* i) {
return __sync_add_and_fetch(i, 1); }
51 static int Decrement(
volatile int* i) {
return __sync_sub_and_fetch(i, 1); }
52 static int AcquireLoad(
volatile const int* i) {
53 return __atomic_load_n(i, __ATOMIC_ACQUIRE);
55 static void ReleaseStore(
volatile int* i,
int value) {
56 __atomic_store_n(i, value, __ATOMIC_RELEASE);
58 static int CompareAndSwap(
volatile int* i,
int old_value,
int new_value) {
59 return __sync_val_compare_and_swap(i, old_value, new_value);
63 static T* AcquireLoadPtr(T*
volatile* ptr) {
64 return __atomic_load_n(ptr, __ATOMIC_ACQUIRE);
67 static T* CompareAndSwapPtr(T*
volatile* ptr, T* old_value, T* new_value) {
68 return __sync_val_compare_and_swap(ptr, old_value, new_value);