| 38 | | unsigned operator++() |
|---|
| 39 | | { |
|---|
| 40 | | #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) |
|---|
| 41 | | return __sync_add_and_fetch(&_value, 1); |
|---|
| 42 | | #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) |
|---|
| 43 | | return __add_and_fetch(&_value, 1); |
|---|
| 44 | | #elif defined(_OPENTHREADS_ATOMIC_USE_SUN) |
|---|
| 45 | | return atomic_inc_uint_nv(&_value); |
|---|
| 46 | | #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) |
|---|
| 47 | | return InterlockedIncrement(&_value); |
|---|
| 48 | | #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX) |
|---|
| 49 | | ScopedLock<Mutex> lock(_mutex); |
|---|
| 50 | | return ++_value; |
|---|
| 51 | | #else |
|---|
| 52 | | return ++_value; |
|---|
| 53 | | #endif |
|---|
| 54 | | } |
|---|
| 55 | | unsigned operator--() |
|---|
| 56 | | { |
|---|
| 57 | | #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) |
|---|
| 58 | | return __sync_sub_and_fetch(&_value, 1); |
|---|
| 59 | | #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) |
|---|
| 60 | | return __sub_and_fetch(&_value, 1); |
|---|
| 61 | | #elif defined(_OPENTHREADS_ATOMIC_USE_SUN) |
|---|
| 62 | | return atomic_dec_uint_nv(&_value); |
|---|
| 63 | | #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) |
|---|
| 64 | | return InterlockedDecrement(&_value); |
|---|
| 65 | | #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX) |
|---|
| 66 | | ScopedLock<Mutex> lock(_mutex); |
|---|
| 67 | | return --_value; |
|---|
| 68 | | #else |
|---|
| 69 | | return --_value; |
|---|
| 70 | | #endif |
|---|
| 71 | | } |
|---|
| 72 | | operator unsigned() const |
|---|
| 73 | | { |
|---|
| 74 | | #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) |
|---|
| 75 | | __sync_synchronize(); |
|---|
| 76 | | return _value; |
|---|
| 77 | | #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) |
|---|
| 78 | | __synchronize(_value); |
|---|
| 79 | | return _value; |
|---|
| 80 | | #elif defined(_OPENTHREADS_ATOMIC_USE_SUN) |
|---|
| 81 | | membar_consumer(); // Hmm, do we need??? |
|---|
| 82 | | return _value; |
|---|
| 83 | | #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) |
|---|
| 84 | | return static_cast<unsigned const volatile &>(_value); |
|---|
| 85 | | #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX) |
|---|
| 86 | | ScopedLock<Mutex> lock(_mutex); |
|---|
| 87 | | return _value; |
|---|
| 88 | | #else |
|---|
| 89 | | return _value; |
|---|
| 90 | | #endif |
|---|
| 91 | | } |
|---|
| 92 | | |
|---|
| | 47 | _OPENTHREADS_ATOMIC_INLINE unsigned operator++(); |
|---|
| | 48 | _OPENTHREADS_ATOMIC_INLINE unsigned operator--(); |
|---|
| | 49 | _OPENTHREADS_ATOMIC_INLINE operator unsigned() const; |
|---|
| 123 | | bool assign(T* ptrNew, const T* const ptrOld) |
|---|
| 124 | | { |
|---|
| 125 | | #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) |
|---|
| 126 | | return __sync_bool_compare_and_swap(&_ptr, ptrOld, ptrNew); |
|---|
| 127 | | #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) |
|---|
| 128 | | return __compare_and_swap(&_ptr, ptrOld, ptrNew); |
|---|
| 129 | | #elif defined(_OPENTHREADS_ATOMIC_USE_SUN) |
|---|
| 130 | | return ptrOld == atomic_cas_ptr(&_ptr, ptrOld, ptrNew); |
|---|
| 131 | | #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) |
|---|
| 132 | | return ptrOld == InterlockedCompareExchangePointer((PVOID volatile*)&_ptr, (PVOID)ptrNew, (PVOID)ptrOld); |
|---|
| 133 | | #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX) |
|---|
| 134 | | ScopedLock<Mutex> lock(_mutex); |
|---|
| 135 | | if (_ptr != ptrOld) |
|---|
| 136 | | return false; |
|---|
| 137 | | _ptr = ptrNew; |
|---|
| 138 | | return true; |
|---|
| 139 | | #else |
|---|
| 140 | | if (_ptr != ptrOld) |
|---|
| 141 | | return false; |
|---|
| 142 | | _ptr = ptrNew; |
|---|
| 143 | | return true; |
|---|
| 144 | | #endif |
|---|
| 145 | | } |
|---|
| 146 | | |
|---|
| 147 | | T* get() const |
|---|
| 148 | | { |
|---|
| 149 | | #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) |
|---|
| 150 | | __sync_synchronize(); |
|---|
| 151 | | return _ptr; |
|---|
| 152 | | #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) |
|---|
| 153 | | __synchronize(_ptr); |
|---|
| 154 | | return _ptr; |
|---|
| 155 | | #elif defined(_OPENTHREADS_ATOMIC_USE_SUN) |
|---|
| 156 | | membar_consumer(); // Hmm, do we need??? |
|---|
| 157 | | return _ptr; |
|---|
| 158 | | #elif defined(_OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED) |
|---|
| 159 | | return _ptr; |
|---|
| 160 | | #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX) |
|---|
| 161 | | ScopedLock<Mutex> lock(_mutex); |
|---|
| 162 | | return _ptr; |
|---|
| 163 | | #else |
|---|
| 164 | | return _ptr; |
|---|
| 165 | | #endif |
|---|
| 166 | | } |
|---|
| | 79 | _OPENTHREADS_ATOMIC_INLINE bool assign(void* ptrNew, const void* const ptrOld); |
|---|
| | 80 | _OPENTHREADS_ATOMIC_INLINE void* get() const; |
|---|
| | 91 | |
|---|
| | 92 | #if !defined(_OPENTHREADS_ATOMIC_USE_LIBRARY_ROUTINES) |
|---|
| | 93 | |
|---|
| | 94 | _OPENTHREADS_ATOMIC_INLINE unsigned |
|---|
| | 95 | Atomic::operator++() |
|---|
| | 96 | { |
|---|
| | 97 | #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) |
|---|
| | 98 | return __sync_add_and_fetch(&_value, 1); |
|---|
| | 99 | #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) |
|---|
| | 100 | return __add_and_fetch(&_value, 1); |
|---|
| | 101 | #elif defined(_OPENTHREADS_ATOMIC_USE_SUN) |
|---|
| | 102 | return atomic_inc_uint_nv(&_value); |
|---|
| | 103 | #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX) |
|---|
| | 104 | ScopedLock<Mutex> lock(_mutex); |
|---|
| | 105 | return ++_value; |
|---|
| | 106 | #else |
|---|
| | 107 | return ++_value; |
|---|
| | 108 | #endif |
|---|
| | 109 | } |
|---|
| | 110 | |
|---|
| | 111 | _OPENTHREADS_ATOMIC_INLINE unsigned |
|---|
| | 112 | Atomic::operator--() |
|---|
| | 113 | { |
|---|
| | 114 | #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) |
|---|
| | 115 | return __sync_sub_and_fetch(&_value, 1); |
|---|
| | 116 | #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) |
|---|
| | 117 | return __sub_and_fetch(&_value, 1); |
|---|
| | 118 | #elif defined(_OPENTHREADS_ATOMIC_USE_SUN) |
|---|
| | 119 | return atomic_dec_uint_nv(&_value); |
|---|
| | 120 | #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX) |
|---|
| | 121 | ScopedLock<Mutex> lock(_mutex); |
|---|
| | 122 | return --_value; |
|---|
| | 123 | #else |
|---|
| | 124 | return --_value; |
|---|
| | 125 | #endif |
|---|
| | 126 | } |
|---|
| | 127 | |
|---|
| | 128 | _OPENTHREADS_ATOMIC_INLINE |
|---|
| | 129 | Atomic::operator unsigned() const |
|---|
| | 130 | { |
|---|
| | 131 | #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) |
|---|
| | 132 | __sync_synchronize(); |
|---|
| | 133 | return _value; |
|---|
| | 134 | #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) |
|---|
| | 135 | __synchronize(); |
|---|
| | 136 | return _value; |
|---|
| | 137 | #elif defined(_OPENTHREADS_ATOMIC_USE_SUN) |
|---|
| | 138 | membar_consumer(); // Hmm, do we need??? |
|---|
| | 139 | return _value; |
|---|
| | 140 | #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX) |
|---|
| | 141 | ScopedLock<Mutex> lock(_mutex); |
|---|
| | 142 | return _value; |
|---|
| | 143 | #else |
|---|
| | 144 | return _value; |
|---|
| | 145 | #endif |
|---|
| | 146 | } |
|---|
| | 147 | |
|---|
| | 148 | _OPENTHREADS_ATOMIC_INLINE bool |
|---|
| | 149 | AtomicPtr::assign(void* ptrNew, const void* const ptrOld) |
|---|
| | 150 | { |
|---|
| | 151 | #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) |
|---|
| | 152 | return __sync_bool_compare_and_swap(&_ptr, ptrOld, ptrNew); |
|---|
| | 153 | #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) |
|---|
| | 154 | return __compare_and_swap((unsigned long*)&_ptr, (unsigned long)ptrOld, (unsigned long)ptrNew); |
|---|
| | 155 | #elif defined(_OPENTHREADS_ATOMIC_USE_SUN) |
|---|
| | 156 | return ptrOld == atomic_cas_ptr(&_ptr, ptrOld, ptrNew); |
|---|
| | 157 | #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX) |
|---|
| | 158 | ScopedLock<Mutex> lock(_mutex); |
|---|
| | 159 | if (_ptr != ptrOld) |
|---|
| | 160 | return false; |
|---|
| | 161 | _ptr = ptrNew; |
|---|
| | 162 | return true; |
|---|
| | 163 | #else |
|---|
| | 164 | if (_ptr != ptrOld) |
|---|
| | 165 | return false; |
|---|
| | 166 | _ptr = ptrNew; |
|---|
| | 167 | return true; |
|---|
| | 168 | #endif |
|---|
| | 169 | } |
|---|
| | 170 | |
|---|
| | 171 | _OPENTHREADS_ATOMIC_INLINE void* |
|---|
| | 172 | AtomicPtr::get() const |
|---|
| | 173 | { |
|---|
| | 174 | #if defined(_OPENTHREADS_ATOMIC_USE_GCC_BUILTINS) |
|---|
| | 175 | __sync_synchronize(); |
|---|
| | 176 | return _ptr; |
|---|
| | 177 | #elif defined(_OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS) |
|---|
| | 178 | __synchronize(); |
|---|
| | 179 | return _ptr; |
|---|
| | 180 | #elif defined(_OPENTHREADS_ATOMIC_USE_SUN) |
|---|
| | 181 | membar_consumer(); // Hmm, do we need??? |
|---|
| | 182 | return _ptr; |
|---|
| | 183 | #elif defined(_OPENTHREADS_ATOMIC_USE_MUTEX) |
|---|
| | 184 | ScopedLock<Mutex> lock(_mutex); |
|---|
| | 185 | return _ptr; |
|---|
| | 186 | #else |
|---|
| | 187 | return _ptr; |
|---|
| | 188 | #endif |
|---|
| | 189 | } |
|---|
| | 190 | |
|---|
| | 191 | #endif // !defined(_OPENTHREADS_ATOMIC_USE_LIBRARY_ROUTINES) |
|---|