29 #ifndef _GLIBCXX_ATOMICITY_H 30 #define _GLIBCXX_ATOMICITY_H 1 32 #ifdef _GLIBCXX_SYSHDR 33 #pragma GCC system_header 37 #include <bits/gthr.h> 39 #if __has_include(<sys/single_threaded.h>) 40 # include <sys/single_threaded.h> 42 #if __cplusplus >= 201103L 46 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
48 _GLIBCXX_BEGIN_NAMESPACE_VERSION
50 __attribute__((__always_inline__))
52 __is_single_threaded() _GLIBCXX_NOTHROW
56 #elif __has_include(<sys/single_threaded.h>) 57 return ::__libc_single_threaded;
59 return !__gthread_active_p();
67 #ifdef _GLIBCXX_ATOMIC_WORD_BUILTINS 69 __attribute__((__always_inline__))
70 __exchange_and_add(
volatile _Atomic_word* __mem,
int __val)
71 {
return __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); }
74 __attribute__((__always_inline__))
75 __atomic_add(
volatile _Atomic_word* __mem,
int __val)
76 { __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); }
77 #else // Defined in config/cpu/.../atomicity.h 79 __exchange_and_add(
volatile _Atomic_word*,
int) _GLIBCXX_NOTHROW;
82 __atomic_add(
volatile _Atomic_word*,
int) _GLIBCXX_NOTHROW;
85 #if __cplusplus < 201103L 90 _Atomic_word_fits_in_long[
sizeof(_Atomic_word) <=
sizeof(
long) ? 1 : -1];
96 #pragma GCC diagnostic push 97 #pragma GCC diagnostic ignored "-Wignored-attributes" 103 #if __cplusplus >= 201103L 104 # define _GLIBCXX_UNSIGNED_ATOMIC_WORD std::make_unsigned<_Atomic_word>::type 109 # define _GLIBCXX_UNSIGNED_ATOMIC_WORD unsigned long 113 __attribute__((__always_inline__))
114 __exchange_and_add_single(_Atomic_word* __mem,
int __val)
116 _Atomic_word __result = *__mem;
118 _GLIBCXX_UNSIGNED_ATOMIC_WORD __u;
126 __attribute__((__always_inline__))
127 __atomic_add_single(_Atomic_word* __mem,
int __val)
129 _GLIBCXX_UNSIGNED_ATOMIC_WORD __u;
134 #undef _GLIBCXX_UNSIGNED_ATOMIC_WORD 135 #pragma GCC diagnostic pop 138 __attribute__ ((__always_inline__))
139 __exchange_and_add_dispatch(_Atomic_word* __mem,
int __val)
141 if (__is_single_threaded())
142 return __exchange_and_add_single(__mem, __val);
144 return __exchange_and_add(__mem, __val);
148 __attribute__ ((__always_inline__))
149 __atomic_add_dispatch(_Atomic_word* __mem,
int __val)
151 if (__is_single_threaded())
152 __atomic_add_single(__mem, __val);
154 __atomic_add(__mem, __val);
157 _GLIBCXX_END_NAMESPACE_VERSION
163 #ifndef _GLIBCXX_READ_MEM_BARRIER 164 #define _GLIBCXX_READ_MEM_BARRIER __atomic_thread_fence (__ATOMIC_ACQUIRE) 166 #ifndef _GLIBCXX_WRITE_MEM_BARRIER 167 #define _GLIBCXX_WRITE_MEM_BARRIER __atomic_thread_fence (__ATOMIC_RELEASE) GNU extensions for public use.