13 long InterlockedInternal::Increment32(
volatile long* location) {
18 return __sync_add_and_fetch(location, 1);
22 long InterlockedInternal::Decrement32(
volatile long* location) {
27 return __sync_sub_and_fetch(location, 1);
31 long InterlockedInternal::Add32(
volatile long* location,
long value) {
34 return _InterlockedExchangeAdd(location, value) + value;
36 return __sync_add_and_fetch(location, value);
40 long InterlockedInternal::Exchange32(
volatile long* location,
long value) {
43 return _InterlockedExchange(location, value);
45 return __sync_lock_test_and_set(location, value);
49 long InterlockedInternal::CompareExchange32(
volatile long* location,
long value,
long comparand) {
52 return _InterlockedCompareExchange(location, value, comparand);
54 return __sync_val_compare_and_swap(location, comparand, value);
58 long long InterlockedInternal::Increment64(
volatile long long* location) {
62 long long oldVal, newVal;
66 }
while (_InterlockedCompareExchange64(location, newVal, oldVal) != oldVal);
69 return _InterlockedIncrement64(location);
72 return __sync_add_and_fetch(location, 1);
76 long long InterlockedInternal::Decrement64(
volatile long long* location) {
80 long long oldVal, newVal;
84 }
while (_InterlockedCompareExchange64(location, newVal, oldVal) != oldVal);
87 return _InterlockedDecrement64(location);
90 return __sync_sub_and_fetch(location, 1);
94 long long InterlockedInternal::Add64(
volatile long long* location,
long long value) {
98 long long oldVal, newVal;
101 newVal = oldVal + value;
102 }
while (_InterlockedCompareExchange64(location, newVal, oldVal) != oldVal);
105 return _InterlockedExchangeAdd64(location, value) + value;
108 return __sync_add_and_fetch(location, value);
112 long long InterlockedInternal::Exchange64(
volatile long long* location,
long long value) {
119 }
while (_InterlockedCompareExchange64(location, value, oldVal) != oldVal);
122 return _InterlockedExchange64(location, value);
125 return __sync_lock_test_and_set(location, value);
129 long long InterlockedInternal::CompareExchange64(
volatile long long* location,
long long value,
long long comparand) {
132 return _InterlockedCompareExchange64(location, value, comparand);
134 return __sync_val_compare_and_swap(location, comparand, value);
Provides atomic operations for variables that are shared by multiple threads.
long __cdecl _InterlockedIncrement(long volatile *Addend)
long __cdecl _InterlockedDecrement(long volatile *Addend)