17 ALWAYS_INLINE
void AtomicAdjustWin32Impl::
18 inc(TVOLATILE AtomicAdjustWin32Impl::Integer &var) {
19 assert((((
size_t)&var) & (
sizeof(Integer) - 1)) == 0);
21 InterlockedIncrement64(&var);
23 InterlockedIncrement(&var);
31 ALWAYS_INLINE
bool AtomicAdjustWin32Impl::
32 dec(TVOLATILE AtomicAdjustWin32Impl::Integer &var) {
33 assert((((
size_t)&var) & (
sizeof(Integer) - 1)) == 0);
35 return (InterlockedDecrement64(&var) != 0);
37 return (InterlockedDecrement(&var) != 0);
45 INLINE AtomicAdjustWin32Impl::Integer AtomicAdjustWin32Impl::
46 add(TVOLATILE AtomicAdjustWin32Impl::Integer &var, AtomicAdjustWin32Impl::Integer delta) {
47 assert((((
size_t)&var) & (
sizeof(Integer) - 1)) == 0);
49 return InterlockedAdd64(&var, delta);
51 Integer orig_value = var;
52 Integer new_value = orig_value + delta;
53 while (compare_and_exchange(var, orig_value, new_value) != orig_value) {
55 new_value = orig_value + delta;
64 ALWAYS_INLINE AtomicAdjustWin32Impl::Integer AtomicAdjustWin32Impl::
65 set(TVOLATILE AtomicAdjustWin32Impl::Integer &var,
66 AtomicAdjustWin32Impl::Integer new_value) {
67 assert((((
size_t)&var) & (
sizeof(Integer) - 1)) == 0);
69 return InterlockedExchange64(&var, new_value);
71 return InterlockedExchange(&var, new_value);
81 ALWAYS_INLINE AtomicAdjustWin32Impl::Integer AtomicAdjustWin32Impl::
82 get(
const TVOLATILE AtomicAdjustWin32Impl::Integer &var) {
87 assert((((
size_t)&var) & (
sizeof(Integer) - 1)) == 0);
94 ALWAYS_INLINE AtomicAdjustWin32Impl::Pointer AtomicAdjustWin32Impl::
95 set_ptr(TVOLATILE AtomicAdjustWin32Impl::Pointer &var,
96 AtomicAdjustWin32Impl::Pointer new_value) {
97 assert((((
size_t)&var) & (
sizeof(Pointer) - 1)) == 0);
98 return InterlockedExchangePointer(&var, new_value);
107 ALWAYS_INLINE AtomicAdjustWin32Impl::Pointer AtomicAdjustWin32Impl::
108 get_ptr(
const TVOLATILE AtomicAdjustWin32Impl::Pointer &var) {
110 assert((((
size_t)&var) & (
sizeof(Pointer) - 1)) == 0);
127 INLINE AtomicAdjustWin32Impl::Integer AtomicAdjustWin32Impl::
128 compare_and_exchange(TVOLATILE AtomicAdjustWin32Impl::Integer &mem,
129 AtomicAdjustWin32Impl::Integer old_value,
130 AtomicAdjustWin32Impl::Integer new_value) {
131 assert((((
size_t)&mem) & (
sizeof(Integer) - 1)) == 0);
135 return InterlockedCompareExchange64((TVOLATILE LONGLONG *)&mem, new_value, old_value);
137 return InterlockedCompareExchange((TVOLATILE LONG *)&mem, new_value, old_value);
146 INLINE AtomicAdjustWin32Impl::Pointer AtomicAdjustWin32Impl::
147 compare_and_exchange_ptr(TVOLATILE AtomicAdjustWin32Impl::Pointer &mem,
148 AtomicAdjustWin32Impl::Pointer old_value,
149 AtomicAdjustWin32Impl::Pointer new_value) {
150 assert((((
size_t)&mem) & (
sizeof(Pointer) - 1)) == 0);
153 return InterlockedCompareExchangePointer(&mem, new_value, old_value);