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); }
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.