43 typedef HANDLE os_native_event_t;
81 #define OS_SYNC_INFINITE_TIME ULINT_UNDEFINED
84 #define OS_SYNC_TIME_EXCEEDED 1
98 extern ulint os_event_count;
99 extern ulint os_mutex_count;
100 extern ulint os_fast_mutex_count;
178 ib_int64_t reset_sig_count);
182 #define os_event_wait(event) os_event_wait_low(event, 0)
183 #define os_event_wait_time(e, t) os_event_wait_time_low(event, t, 0)
197 ib_int64_t reset_sig_count);
270 #if defined(HAVE_GCC_ATOMIC_BUILTINS)
272 #define HAVE_ATOMIC_BUILTINS
278 # define os_compare_and_swap(ptr, old_val, new_val) \
279 __sync_bool_compare_and_swap(ptr, old_val, new_val)
281 # define os_compare_and_swap_ulint(ptr, old_val, new_val) \
282 os_compare_and_swap(ptr, old_val, new_val)
284 # define os_compare_and_swap_lint(ptr, old_val, new_val) \
285 os_compare_and_swap(ptr, old_val, new_val)
287 # ifdef HAVE_IB_ATOMIC_PTHREAD_T_GCC
288 # define os_compare_and_swap_thread_id(ptr, old_val, new_val) \
289 os_compare_and_swap(ptr, old_val, new_val)
290 # define INNODB_RW_LOCKS_USE_ATOMICS
291 # define IB_ATOMICS_STARTUP_MSG \
292 "Mutexes and rw_locks use GCC atomic builtins"
294 # define IB_ATOMICS_STARTUP_MSG \
295 "Mutexes use GCC atomic builtins, rw_locks do not"
302 # define os_atomic_increment(ptr, amount) \
303 __sync_add_and_fetch(ptr, amount)
305 # define os_atomic_increment_lint(ptr, amount) \
306 os_atomic_increment(ptr, amount)
308 # define os_atomic_increment_ulint(ptr, amount) \
309 os_atomic_increment(ptr, amount)
314 # define os_atomic_test_and_set_byte(ptr, new_val) \
315 __sync_lock_test_and_set(ptr, (byte) new_val)
317 #elif defined(HAVE_SOLARIS_ATOMICS)
319 #define HAVE_ATOMIC_BUILTINS
330 # define os_compare_and_swap_ulint(ptr, old_val, new_val) \
331 (atomic_cas_ulong(ptr, old_val, new_val) == old_val)
333 # define os_compare_and_swap_lint(ptr, old_val, new_val) \
334 ((lint)atomic_cas_ulong((ulong_t*) ptr, old_val, new_val) == old_val)
336 # ifdef HAVE_IB_ATOMIC_PTHREAD_T_SOLARIS
337 # if SIZEOF_PTHREAD_T == 4
338 # define os_compare_and_swap_thread_id(ptr, old_val, new_val) \
339 ((pthread_t)atomic_cas_32(ptr, old_val, new_val) == old_val)
340 # elif SIZEOF_PTHREAD_T == 8
341 # define os_compare_and_swap_thread_id(ptr, old_val, new_val) \
342 ((pthread_t)atomic_cas_64(ptr, old_val, new_val) == old_val)
344 # error "SIZEOF_PTHREAD_T != 4 or 8"
346 # define INNODB_RW_LOCKS_USE_ATOMICS
347 # define IB_ATOMICS_STARTUP_MSG \
348 "Mutexes and rw_locks use Solaris atomic functions"
350 # define IB_ATOMICS_STARTUP_MSG \
351 "Mutexes use Solaris atomic functions, rw_locks do not"
358 # define os_atomic_increment_lint(ptr, amount) \
359 atomic_add_long_nv((ulong_t*) ptr, amount)
361 # define os_atomic_increment_ulint(ptr, amount) \
362 atomic_add_long_nv(ptr, amount)
367 # define os_atomic_test_and_set_byte(ptr, new_val) \
368 atomic_swap_uchar(ptr, new_val)
370 #elif defined(HAVE_WINDOWS_ATOMICS)
372 #define HAVE_ATOMIC_BUILTINS
376 # define win_cmp_and_xchg InterlockedCompareExchange64
377 # define win_xchg_and_add InterlockedExchangeAdd64
379 # define win_cmp_and_xchg InterlockedCompareExchange
380 # define win_xchg_and_add InterlockedExchangeAdd
387 # define os_compare_and_swap_ulint(ptr, old_val, new_val) \
388 (win_cmp_and_xchg(ptr, new_val, old_val) == old_val)
390 # define os_compare_and_swap_lint(ptr, old_val, new_val) \
391 (win_cmp_and_xchg(ptr, new_val, old_val) == old_val)
394 # define os_compare_and_swap_thread_id(ptr, old_val, new_val) \
395 (InterlockedCompareExchange(ptr, new_val, old_val) == old_val)
396 # define INNODB_RW_LOCKS_USE_ATOMICS
397 # define IB_ATOMICS_STARTUP_MSG \
398 "Mutexes and rw_locks use Windows interlocked functions"
404 # define os_atomic_increment_lint(ptr, amount) \
405 (win_xchg_and_add(ptr, amount) + amount)
407 # define os_atomic_increment_ulint(ptr, amount) \
408 ((ulint) (win_xchg_and_add(ptr, amount) + amount))
415 # define os_atomic_test_and_set_byte(ptr, new_val) \
416 ((byte) InterlockedExchange(ptr, new_val))
419 # define IB_ATOMICS_STARTUP_MSG \
420 "Mutexes and rw_locks use InnoDB's own implementation"
424 #include "os0sync.ic"