28 return ::InterlockedIncrement(
reinterpret_cast<volatile LONG*
>(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);
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); }
53 return __atomic_load_n(i, __ATOMIC_ACQUIRE);
56 __atomic_store_n(i, value, __ATOMIC_RELEASE);
59 return __sync_val_compare_and_swap(i, old_value, new_value);
64 return __atomic_load_n(ptr, __ATOMIC_ACQUIRE);
68 return __sync_val_compare_and_swap(ptr, old_value, new_value);