29#ifndef _GLIBCXX_ATOMICITY_H
30#define _GLIBCXX_ATOMICITY_H 1
32#pragma GCC system_header
37#if __has_include(<sys/single_threaded.h>)
38# include <sys/single_threaded.h>
41namespace __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.