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>
43 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
45 _GLIBCXX_BEGIN_NAMESPACE_VERSION
47 __attribute__((__always_inline__))
49 __is_single_threaded() _GLIBCXX_NOTHROW
53 #elif __has_include(<sys/single_threaded.h>)
54 return ::__libc_single_threaded;
56 return !__gthread_active_p();
64 #ifdef _GLIBCXX_ATOMIC_BUILTINS
66 __attribute__((__always_inline__))
67 __exchange_and_add(
volatile _Atomic_word* __mem,
int __val)
68 {
return __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); }
71 __attribute__((__always_inline__))
72 __atomic_add(
volatile _Atomic_word* __mem,
int __val)
73 { __atomic_fetch_add(__mem, __val, __ATOMIC_ACQ_REL); }
76 __exchange_and_add(
volatile _Atomic_word*,
int) _GLIBCXX_NOTHROW;
79 __atomic_add(
volatile _Atomic_word*,
int) _GLIBCXX_NOTHROW;
83 __attribute__((__always_inline__))
84 __exchange_and_add_single(_Atomic_word* __mem,
int __val)
86 _Atomic_word __result = *__mem;
92 __attribute__((__always_inline__))
93 __atomic_add_single(_Atomic_word* __mem,
int __val)
97 __attribute__ ((__always_inline__))
98 __exchange_and_add_dispatch(_Atomic_word* __mem,
int __val)
100 if (__is_single_threaded())
101 return __exchange_and_add_single(__mem, __val);
103 return __exchange_and_add(__mem, __val);
107 __attribute__ ((__always_inline__))
108 __atomic_add_dispatch(_Atomic_word* __mem,
int __val)
110 if (__is_single_threaded())
111 __atomic_add_single(__mem, __val);
113 __atomic_add(__mem, __val);
116 _GLIBCXX_END_NAMESPACE_VERSION
122 #ifndef _GLIBCXX_READ_MEM_BARRIER
123 #define _GLIBCXX_READ_MEM_BARRIER __atomic_thread_fence (__ATOMIC_ACQUIRE)
125 #ifndef _GLIBCXX_WRITE_MEM_BARRIER
126 #define _GLIBCXX_WRITE_MEM_BARRIER __atomic_thread_fence (__ATOMIC_RELEASE)
GNU extensions for public use.