49 #elif defined(MUTEX_FUTEX) 59 #if defined __i386__ || defined __x86_64__ || defined _M_IX86 || \ 60 defined _M_X64 || defined __WIN__ 62 #define IB_STRONG_MEMORY_MODEL 92 lint win_cmp_and_xchg_lint(
100 lint win_xchg_and_add(
volatile lint *ptr,
107 ulint win_cmp_and_xchg_ulint(
117 win_cmp_and_xchg_dword(
volatile DWORD *ptr,
124 #define os_compare_and_swap_lint(ptr, old_val, new_val) \ 125 (win_cmp_and_xchg_lint(ptr, new_val, old_val) == old_val) 127 #define os_compare_and_swap_ulint(ptr, old_val, new_val) \ 128 (win_cmp_and_xchg_ulint(ptr, new_val, old_val) == old_val) 130 #define os_compare_and_swap_uint32(ptr, old_val, new_val) \ 131 (InterlockedCompareExchange( \ 132 reinterpret_cast<volatile LONG *>(ptr), static_cast<LONG>(new_val), \ 133 static_cast<LONG>(old_val)) == static_cast<LONG>(old_val)) 135 #define os_compare_and_swap_uint64(ptr, old_val, new_val) \ 136 (InterlockedCompareExchange64(reinterpret_cast<volatile LONGLONG *>(ptr), \ 137 static_cast<LONGLONG>(new_val), \ 138 static_cast<LONGLONG>(old_val)) == \ 139 static_cast<LONGLONG>(old_val)) 142 #define os_compare_and_swap_thread_id(ptr, old_val, new_val) \ 143 (InterlockedCompareExchangePointer(ptr, new_val, old_val) == old_val) 145 #define INNODB_RW_LOCKS_USE_ATOMICS 146 #define IB_ATOMICS_STARTUP_MSG \ 147 "Mutexes and rw_locks use Windows interlocked functions" 152 #define os_atomic_increment_lint(ptr, amount) \ 153 (win_xchg_and_add(ptr, amount) + amount) 155 #define os_atomic_increment_ulint(ptr, amount) \ 156 (static_cast<ulint>(win_xchg_and_add(reinterpret_cast<volatile lint *>(ptr), \ 157 static_cast<lint>(amount))) + \ 158 static_cast<ulint>(amount)) 160 #define os_atomic_increment_uint32(ptr, amount) \ 161 (static_cast<ulint>(InterlockedExchangeAdd(reinterpret_cast<long *>(ptr), \ 162 static_cast<long>(amount))) + \ 163 static_cast<ulint>(amount)) 165 #define os_atomic_increment_uint64(ptr, amount) \ 166 (static_cast<ib_uint64_t>(InterlockedExchangeAdd64( \ 167 reinterpret_cast<LONGLONG *>(ptr), static_cast<LONGLONG>(amount))) + \ 168 static_cast<ib_uint64_t>(amount)) 173 #define os_atomic_decrement_lint(ptr, amount) \ 174 (win_xchg_and_add(ptr, -(static_cast<lint>(amount))) - amount) 176 #define os_atomic_decrement_ulint(ptr, amount) \ 177 (static_cast<ulint>(win_xchg_and_add(reinterpret_cast<volatile lint *>(ptr), \ 178 -(static_cast<lint>(amount)))) - \ 179 static_cast<ulint>(amount)) 181 #define os_atomic_decrement_uint32(ptr, amount) \ 182 (static_cast<ib_uint32_t>(InterlockedExchangeAdd( \ 183 reinterpret_cast<long *>(ptr), -(static_cast<long>(amount)))) - \ 184 static_cast<ib_uint32_t>(amount)) 186 #define os_atomic_decrement_uint64(ptr, amount) \ 187 (static_cast<ib_uint64_t>(InterlockedExchangeAdd64( \ 188 reinterpret_cast<LONGLONG *>(ptr), -(static_cast<LONGLONG>(amount)))) - \ 189 static_cast<ib_uint64_t>(amount)) 197 #if defined(HAVE_GCC_SYNC_BUILTINS) 199 #define os_compare_and_swap(ptr, old_val, new_val) \ 200 __sync_bool_compare_and_swap(ptr, old_val, new_val) 202 #define os_compare_and_swap_ulint(ptr, old_val, new_val) \ 203 os_compare_and_swap(ptr, old_val, new_val) 205 #define os_compare_and_swap_lint(ptr, old_val, new_val) \ 206 os_compare_and_swap(ptr, old_val, new_val) 208 #define os_compare_and_swap_uint32(ptr, old_val, new_val) \ 209 os_compare_and_swap(ptr, old_val, new_val) 211 #define os_compare_and_swap_uint64(ptr, old_val, new_val) \ 212 os_compare_and_swap(ptr, old_val, new_val) 219 return __atomic_compare_exchange_n(ptr, &old_val, new_val, 0,
220 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
225 return __atomic_compare_exchange_n(ptr, &old_val, new_val, 0,
226 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
231 ib_uint32_t new_val) {
232 return __atomic_compare_exchange_n(ptr, &old_val, new_val, 0,
233 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
238 ib_uint64_t new_val) {
239 return __atomic_compare_exchange_n(ptr, &old_val, new_val, 0,
240 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
245 #ifdef HAVE_IB_ATOMIC_PTHREAD_T_GCC 246 #if defined(HAVE_GCC_SYNC_BUILTINS) 247 #define os_compare_and_swap_thread_id(ptr, old_val, new_val) \ 248 os_compare_and_swap(ptr, old_val, new_val) 254 return __atomic_compare_exchange_n(ptr, &old_val, new_val, 0,
255 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
258 #define INNODB_RW_LOCKS_USE_ATOMICS 259 #define IB_ATOMICS_STARTUP_MSG "Mutexes and rw_locks use GCC atomic builtins" 261 #define IB_ATOMICS_STARTUP_MSG \ 262 "Mutexes use GCC atomic builtins, rw_locks do not" 268 #if defined(HAVE_GCC_SYNC_BUILTINS) 269 #define os_atomic_increment(ptr, amount) __sync_add_and_fetch(ptr, amount) 271 #define os_atomic_increment(ptr, amount) \ 272 __atomic_add_fetch(ptr, amount, __ATOMIC_SEQ_CST) 275 #define os_atomic_increment_lint(ptr, amount) os_atomic_increment(ptr, amount) 277 #define os_atomic_increment_ulint(ptr, amount) os_atomic_increment(ptr, amount) 279 #define os_atomic_increment_uint32(ptr, amount) os_atomic_increment(ptr, amount) 281 #define os_atomic_increment_uint64(ptr, amount) os_atomic_increment(ptr, amount) 286 #if defined(HAVE_GCC_SYNC_BUILTINS) 287 #define os_atomic_decrement(ptr, amount) __sync_sub_and_fetch(ptr, amount) 289 #define os_atomic_decrement(ptr, amount) \ 290 __atomic_sub_fetch(ptr, amount, __ATOMIC_SEQ_CST) 293 #define os_atomic_decrement_lint(ptr, amount) os_atomic_decrement(ptr, amount) 295 #define os_atomic_decrement_ulint(ptr, amount) os_atomic_decrement(ptr, amount) 297 #define os_atomic_decrement_uint32(ptr, amount) os_atomic_decrement(ptr, amount) 299 #define os_atomic_decrement_uint64(ptr, amount) os_atomic_decrement(ptr, amount) 303 #define os_atomic_inc_ulint(m, v, d) os_atomic_increment_ulint(v, d) 304 #define os_atomic_dec_ulint(m, v, d) os_atomic_decrement_ulint(v, d) 305 #define TAS(l, n) os_atomic_test_and_set((l), (n)) 306 #define CAS(l, o, n) os_atomic_val_compare_and_swap((l), (o), (n)) 309 #ifdef HAVE_IB_GCC_ATOMIC_THREAD_FENCE 310 #define HAVE_MEMORY_BARRIER 311 #define os_rmb __atomic_thread_fence(__ATOMIC_ACQUIRE) 312 #define os_wmb __atomic_thread_fence(__ATOMIC_RELEASE) 313 #define IB_MEMORY_BARRIER_STARTUP_MSG \ 314 "GCC builtin __atomic_thread_fence() is used for memory barrier" 316 #elif defined(HAVE_IB_GCC_SYNC_SYNCHRONISE) 317 #define HAVE_MEMORY_BARRIER 318 #define os_rmb __sync_synchronize() 319 #define os_wmb __sync_synchronize() 320 #define IB_MEMORY_BARRIER_STARTUP_MSG \ 321 "GCC builtin __sync_synchronize() is used for memory barrier" 323 #elif defined(HAVE_IB_MACHINE_BARRIER_SOLARIS) 324 #define HAVE_MEMORY_BARRIER 325 #include <mbarrier.h> 326 #define os_rmb __machine_r_barrier() 327 #define os_wmb __machine_w_barrier() 328 #define IB_MEMORY_BARRIER_STARTUP_MSG \ 329 "Solaris memory ordering functions are used for memory barrier" 331 #elif defined(HAVE_WINDOWS_MM_FENCE) && defined(_WIN64) 332 #define HAVE_MEMORY_BARRIER 333 #include <mmintrin.h> 334 #define os_rmb _mm_lfence() 335 #define os_wmb _mm_sfence() 336 #define IB_MEMORY_BARRIER_STARTUP_MSG \ 337 "_mm_lfence() and _mm_sfence() are used for memory barrier" 342 #define IB_MEMORY_BARRIER_STARTUP_MSG "Memory barrier is not used" 345 #include "os0atomic.ic" #define os_compare_and_swap_ulint(ptr, old_val, new_val)
Definition: os0atomic.h:202
#define os_compare_and_swap_uint64(ptr, old_val, new_val)
Definition: os0atomic.h:211
UNIV_INLINE lock_word_t os_atomic_test_and_set(volatile lock_word_t *ptr, lock_word_t new_val)
Atomic compare-and-swap and increment for InnoDB.
#define os_compare_and_swap_uint32(ptr, old_val, new_val)
Definition: os0atomic.h:208
ulint lock_word_t
Definition: os0atomic.h:55
UNIV_INLINE lock_word_t os_atomic_val_compare_and_swap(volatile lock_word_t *ptr, lock_word_t old_val, lock_word_t new_val)
Do an atomic compare and set.
std::thread::native_handle_type os_thread_id_t
Operating system thread native handle.
Definition: os0thread.h:40
#define os_compare_and_swap_lint(ptr, old_val, new_val)
Definition: os0atomic.h:205