29#ifndef _GLIBCXX_ATOMICITY_H
30#define _GLIBCXX_ATOMICITY_H 1
33#pragma GCC system_header
39#if __has_include(<sys/single_threaded.h>)
40# include <sys/single_threaded.h>
43namespace __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_WORD_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.