29 #ifndef _GLIBCXX_ATOMICITY_H
30 #define _GLIBCXX_ATOMICITY_H 1
32 #pragma GCC system_header
35 #include <bits/gthr.h>
37 #if __has_include(<sys/single_threaded.h>)
38 # include <sys/single_threaded.h>
41 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
43 _GLIBCXX_BEGIN_NAMESPACE_VERSION
45 __attribute__((__always_inline__))
47 __is_single_threaded() _GLIBCXX_NOTHROW
51 #elif __has_include(<sys/single_threaded.h>)
52 return ::__libc_single_threaded;
54 return !__gthread_active_p();
62 #ifdef _GLIBCXX_ATOMIC_BUILTINS
64 __attribute__((__always_inline__))
65 __exchange_and_add(
volatile _Atomic_word* __mem,
int __val)
66 {
return __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); }
69 __attribute__((__always_inline__))
70 __atomic_add(
volatile _Atomic_word* __mem,
int __val)
71 { __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); }
74 __exchange_and_add(
volatile _Atomic_word*,
int) _GLIBCXX_NOTHROW;
77 __atomic_add(
volatile _Atomic_word*,
int) _GLIBCXX_NOTHROW;
81 __attribute__((__always_inline__))
82 __exchange_and_add_single(_Atomic_word* __mem,
int __val)
84 _Atomic_word __result = *__mem;
90 __attribute__((__always_inline__))
91 __atomic_add_single(_Atomic_word* __mem,
int __val)
95 __attribute__ ((__always_inline__))
96 __exchange_and_add_dispatch(_Atomic_word* __mem,
int __val)
98 if (__is_single_threaded())
99 return __exchange_and_add_single(__mem, __val);
101 return __exchange_and_add(__mem, __val);
105 __attribute__ ((__always_inline__))
106 __atomic_add_dispatch(_Atomic_word* __mem,
int __val)
108 if (__is_single_threaded())
109 __atomic_add_single(__mem, __val);
111 __atomic_add(__mem, __val);
114 _GLIBCXX_END_NAMESPACE_VERSION
120 #ifndef _GLIBCXX_READ_MEM_BARRIER
121 #define _GLIBCXX_READ_MEM_BARRIER __atomic_thread_fence (__ATOMIC_ACQUIRE)
123 #ifndef _GLIBCXX_WRITE_MEM_BARRIER
124 #define _GLIBCXX_WRITE_MEM_BARRIER __atomic_thread_fence (__ATOMIC_RELEASE)
GNU extensions for public use.