Loading...
Searching...
No Matches
Go to the documentation of this file.
24#ifndef AO_ATOMIC_OPS_H
25#define AO_ATOMIC_OPS_H
161#define AO_TS_INITIALIZER ((AO_TS_t)AO_TS_CLEAR)
164#if defined(__GNUC__) && defined(__GNUC_MINOR__)
165# define AO_GNUC_PREREQ(major, minor) \
166 ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((major) << 16) + (minor))
168# define AO_GNUC_PREREQ(major, minor) 0
172#if defined(__clang__) && defined(__clang_major__)
173# define AO_CLANG_PREREQ(major, minor) \
174 ((__clang_major__ << 16) + __clang_minor__ >= ((major) << 16) + (minor))
176# define AO_CLANG_PREREQ(major, minor) 0
180#if (defined(__GNUC__) || defined(_MSC_VER) || defined(__INTEL_COMPILER) \
181 || defined(__DMC__) || defined(__WATCOMC__)) && !defined(AO_NO_INLINE)
182# define AO_INLINE static __inline
183#elif defined(__sun) && !defined(AO_NO_INLINE)
184# define AO_INLINE static inline
186# define AO_INLINE static
189#if AO_GNUC_PREREQ(3, 0) && !defined(LINT2)
190# define AO_EXPECT_FALSE(expr) __builtin_expect(expr, 0)
193# define AO_EXPECT_FALSE(expr) (expr)
196#if defined(__has_feature)
198# if __has_feature(address_sanitizer)
199# define AO_ADDRESS_SANITIZER
201# if __has_feature(memory_sanitizer)
202# define AO_MEMORY_SANITIZER
204# if __has_feature(thread_sanitizer)
205# define AO_THREAD_SANITIZER
208# ifdef __SANITIZE_ADDRESS__
210# define AO_ADDRESS_SANITIZER
214#ifndef AO_ATTR_NO_SANITIZE_MEMORY
215# ifndef AO_MEMORY_SANITIZER
216# define AO_ATTR_NO_SANITIZE_MEMORY
217# elif AO_CLANG_PREREQ(3, 8)
218# define AO_ATTR_NO_SANITIZE_MEMORY __attribute__((no_sanitize("memory")))
220# define AO_ATTR_NO_SANITIZE_MEMORY __attribute__((no_sanitize_memory))
224#ifndef AO_ATTR_NO_SANITIZE_THREAD
225# ifndef AO_THREAD_SANITIZER
226# define AO_ATTR_NO_SANITIZE_THREAD
227# elif AO_CLANG_PREREQ(3, 8)
228# define AO_ATTR_NO_SANITIZE_THREAD __attribute__((no_sanitize("thread")))
230# define AO_ATTR_NO_SANITIZE_THREAD __attribute__((no_sanitize_thread))
234#if (AO_GNUC_PREREQ(7, 5) || __STDC_VERSION__ >= 201112L) && !defined(LINT2)
235# define AO_ALIGNOF_SUPPORTED 1
238#if defined(AO_DLL) && !defined(AO_API)
240# if defined(__CEGCC__) || (defined(__MINGW32__) && !defined(__cplusplus))
241# define AO_API __declspec(dllexport)
242# elif defined(_MSC_VER) || defined(__BORLANDC__) || defined(__CYGWIN__) \
243 || defined(__DMC__) || defined(__MINGW32__) || defined(__WATCOMC__)
244# define AO_API extern __declspec(dllexport)
247# if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__CEGCC__) \
248 || defined(__CYGWIN__) || defined(__DMC__)
249# define AO_API __declspec(dllimport)
250# elif defined(__MINGW32_DELAY_LOAD__)
251# define AO_API __declspec(dllexport)
252# elif defined(__MINGW32__) || defined(__WATCOMC__)
253# define AO_API extern __declspec(dllimport)
259# define AO_API extern
262#ifdef AO_ALIGNOF_SUPPORTED
263# define AO_ASSERT_ADDR_ALIGNED(addr) \
264 assert(((size_t)(addr) & (__alignof__(*(addr)) - 1)) == 0)
266# define AO_ASSERT_ADDR_ALIGNED(addr) \
267 assert(((size_t)(addr) & (sizeof(*(addr)) - 1)) == 0)
270#if defined(__GNUC__) && !defined(__INTEL_COMPILER)
271# define AO_compiler_barrier() __asm__ __volatile__("" : : : "memory")
272#elif defined(_MSC_VER) || defined(__DMC__) || defined(__BORLANDC__) \
273 || defined(__WATCOMC__)
274# if defined(_AMD64_) || defined(_M_X64) || _MSC_VER >= 1400
275# if defined(_WIN32_WCE)
277# elif defined(_MSC_VER)
280# pragma intrinsic(_ReadWriteBarrier)
281# define AO_compiler_barrier() _ReadWriteBarrier()
285# define AO_compiler_barrier() __asm { }
289#elif defined(__INTEL_COMPILER)
290# define AO_compiler_barrier() __memory_barrier()
292#elif defined(_HPUX_SOURCE)
294# include <machine/sys/inline.h>
295# define AO_compiler_barrier() _Asm_sched_fence()
299 static volatile int AO_barrier_dummy;
300# define AO_compiler_barrier() (void)(AO_barrier_dummy = AO_barrier_dummy)
305# define AO_compiler_barrier() asm("")
308#if defined(AO_USE_PTHREAD_DEFS)
312#if (defined(__CC_ARM) || defined(__ARMCC__)) && !defined(__GNUC__) \
313 && !defined(AO_USE_PTHREAD_DEFS)
315# define AO_GENERALIZE_TWICE
318#if defined(__GNUC__) && !defined(AO_USE_PTHREAD_DEFS) \
319 && !defined(__INTEL_COMPILER)
320# if defined(__i386__)
325# elif defined(__x86_64__)
326# if AO_GNUC_PREREQ(4, 2) && !defined(AO_USE_SYNC_CAS_BUILTIN)
328# define AO_USE_SYNC_CAS_BUILTIN
331# elif defined(__ia64__)
333# define AO_GENERALIZE_TWICE
334# elif defined(__hppa__)
336# define AO_CAN_EMUL_CAS
337# elif defined(__alpha__)
339# define AO_GENERALIZE_TWICE
340# elif defined(__s390__)
342# elif defined(__sparc__)
344# define AO_CAN_EMUL_CAS
345# elif defined(__m68k__)
347# elif defined(__powerpc__) || defined(__ppc__) || defined(__PPC__) \
348 || defined(__powerpc64__) || defined(__ppc64__) || defined(_ARCH_PPC)
350# elif defined(__aarch64__)
352# define AO_CAN_EMUL_CAS
353# elif defined(__arm__)
355# define AO_CAN_EMUL_CAS
356# elif defined(__cris__) || defined(CRIS)
358# define AO_CAN_EMUL_CAS
359# define AO_GENERALIZE_TWICE
360# elif defined(__mips__)
362# elif defined(__sh__) || defined(SH4)
364# define AO_CAN_EMUL_CAS
365# elif defined(__avr32__)
367# elif defined(__e2k__)
369# elif defined(__hexagon__)
371# elif defined(__nios2__)
373# define AO_CAN_EMUL_CAS
374# elif defined(__riscv)
376# elif defined(__tile__)
383#if (defined(__IBMC__) || defined(__IBMCPP__)) && !defined(__GNUC__) \
384 && !defined(AO_USE_PTHREAD_DEFS)
385# if defined(__powerpc__) || defined(__powerpc) || defined(__ppc__) \
386 || defined(__PPC__) || defined(_M_PPC) || defined(_ARCH_PPC) \
387 || defined(_ARCH_PWR)
389# define AO_GENERALIZE_TWICE
393#if defined(__INTEL_COMPILER) && !defined(AO_USE_PTHREAD_DEFS)
394# if defined(__ia64__)
396# define AO_GENERALIZE_TWICE
398# if defined(__GNUC__)
400# if defined(__i386__)
403# if defined(__x86_64__)
404# if (__INTEL_COMPILER > 1110) && !defined(AO_USE_SYNC_CAS_BUILTIN)
405# define AO_USE_SYNC_CAS_BUILTIN
412#if defined(_HPUX_SOURCE) && !defined(__GNUC__) && !defined(AO_USE_PTHREAD_DEFS)
415# define AO_GENERALIZE_TWICE
418# define AO_CAN_EMUL_CAS
422#if defined(_MSC_VER) || defined(__DMC__) || defined(__BORLANDC__) \
423 || (defined(__WATCOMC__) && defined(__NT__))
424# if defined(_AMD64_) || defined(_M_X64)
426# elif defined(_M_ARM64)
428# elif defined(_M_IX86) || defined(x86)
430# elif defined(_M_ARM) || defined(ARM) || defined(_ARM_)
432# define AO_GENERALIZE_TWICE
436#if defined(__sun) && !defined(__GNUC__) && !defined(AO_USE_PTHREAD_DEFS)
438# if defined(__i386) || defined(__x86_64) || defined(__amd64)
443#if !defined(__GNUC__) && (defined(sparc) || defined(__sparc)) \
444 && !defined(AO_USE_PTHREAD_DEFS)
446# define AO_CAN_EMUL_CAS
449#if (defined(AO_REQUIRE_CAS) && !defined(AO_HAVE_compare_and_swap) \
450 && !defined(AO_HAVE_fetch_compare_and_swap) \
451 && !defined(AO_HAVE_compare_and_swap_full) \
452 && !defined(AO_HAVE_fetch_compare_and_swap_full) \
453 && !defined(AO_HAVE_compare_and_swap_acquire) \
454 && !defined(AO_HAVE_fetch_compare_and_swap_acquire)) || defined(CPPCHECK)
455# if defined(AO_CAN_EMUL_CAS)
457# elif !defined(CPPCHECK)
458# error Cannot implement AO_compare_and_swap_full on this architecture.
464#if defined(AO_AO_TS_T) && !defined(AO_HAVE_CLEAR)
465# define AO_CLEAR(addr) AO_store_release((AO_TS_t *)(addr), AO_TS_CLEAR)
466# define AO_HAVE_CLEAR
468#if defined(AO_CHAR_TS_T) && !defined(AO_HAVE_CLEAR)
469# define AO_CLEAR(addr) AO_char_store_release((AO_TS_t *)(addr), AO_TS_CLEAR)
470# define AO_HAVE_CLEAR
474#if !defined(AO_GENERALIZE_TWICE) && defined(AO_CAN_EMUL_CAS) \
475 && !defined(AO_HAVE_compare_and_swap_full) \
476 && !defined(AO_HAVE_fetch_compare_and_swap_full)
477# define AO_GENERALIZE_TWICE
485#if !defined(AO_GENERALIZE_TWICE) \
486 && defined(AO_HAVE_compare_double_and_swap_double) \
487 && (!defined(AO_HAVE_double_load) || !defined(AO_HAVE_double_store))
488# define AO_GENERALIZE_TWICE
494# ifndef AO_GENERALIZE_TWICE
496# define AO_GENERALIZE_TWICE
500#ifdef AO_GENERALIZE_TWICE
505#define AO_TS_T AO_TS_t
507#define AO_TS_VAL AO_TS_VAL_t