29#ifndef ETL_ATOMIC_GCC_SYNC_INCLUDED
30#define ETL_ATOMIC_GCC_SYNC_INCLUDED
32#include "../platform.h"
33#include "../type_traits.h"
34#include "../static_assert.h"
35#include "../nullptr.h"
36#include "../char_traits.h"
43#if defined(ETL_COMPILER_ARM5)
44 #define ETL_USE_SYNC_BUILTINS
48#if defined(ETL_COMPILER_ARM6)
49 #if ETL_COMPILER_FULL_VERSION >= 40700
50 #define ETL_USE_ATOMIC_BUILTINS
52 #define ETL_USE_SYNC_BUILTINS
57#if defined(ETL_COMPILER_GCC)
58 #if ETL_COMPILER_FULL_VERSION >= 40700
59 #define ETL_USE_ATOMIC_BUILTINS
61 #define ETL_USE_SYNC_BUILTINS
66#if defined(ETL_COMPILER_CLANG)
67 #if ETL_COMPILER_FULL_VERSION >= 50000
68 #define ETL_USE_ATOMIC_BUILTINS
70 #define ETL_USE_SYNC_BUILTINS
76#if defined(ETL_USE_ATOMIC_BUILTINS)
78#define ETL_BUILTIN_LOCK while (__atomic_test_and_set(&flag, etl::memory_order_seq_cst)) {}
79#define ETL_BUILTIN_UNLOCK __atomic_clear(&flag, etl::memory_order_seq_cst);
86 typedef enum memory_order
96 template <
bool Is_Always_Lock_Free>
102 template <
bool Is_Always_Lock_Free>
103 ETL_CONSTANT
bool atomic_traits<Is_Always_Lock_Free>::is_always_lock_free;
131 T operator =(
T v)
volatile
144 T operator ++()
volatile
155 T operator ++(
int)
volatile
166 T operator --()
volatile
177 T operator --(
int)
volatile
188 T operator +=(
T v)
volatile
199 T operator -=(
T v)
volatile
243 operator T()
volatile const
260 void store(
T v, etl::memory_order
order = etl::memory_order_seq_cst)
265 void store(
T v, etl::memory_order
order = etl::memory_order_seq_cst)
volatile
271 T load(etl::memory_order
order = etl::memory_order_seq_cst)
const
276 T load(etl::memory_order
order = etl::memory_order_seq_cst)
const volatile
309 T fetch_or(
T v, etl::memory_order
order = etl::memory_order_seq_cst)
volatile
342 T exchange(
T v, etl::memory_order
order = etl::memory_order_seq_cst)
volatile
391 atomic& operator =(
const atomic&) ETL_DELETE;
392 atomic& operator =(
const atomic&)
volatile ETL_DELETE;
400 template <
typename T>
423 T* operator =(
T*
v)
volatile
436 T* operator ++()
volatile
447 T* operator ++(
int)
volatile
458 T* operator --()
volatile
469 T* operator --(
int)
volatile
502 operator T*()
volatile const
519 void store(
T*
v, etl::memory_order
order = etl::memory_order_seq_cst)
524 void store(
T*
v, etl::memory_order
order = etl::memory_order_seq_cst)
volatile
530 T*
load(etl::memory_order
order = etl::memory_order_seq_cst)
const
535 T*
load(etl::memory_order
order = etl::memory_order_seq_cst)
const volatile
568 T*
exchange(
T*
v, etl::memory_order
order = etl::memory_order_seq_cst)
volatile
633 atomic& operator =(
const atomic&) ETL_DELETE;
634 atomic& operator =(
const atomic&)
volatile ETL_DELETE;
658 bool operator =(
bool v)
665 bool operator =(
bool v)
volatile
673 operator bool ()
const
678 operator bool()
volatile const
695 void store(
bool v, etl::memory_order
order = etl::memory_order_seq_cst)
700 void store(
bool v, etl::memory_order
order = etl::memory_order_seq_cst)
volatile
706 bool load(etl::memory_order
order = etl::memory_order_seq_cst)
const
711 bool load(etl::memory_order
order = etl::memory_order_seq_cst)
const volatile
717 bool exchange(
bool v, etl::memory_order
order = etl::memory_order_seq_cst)
722 bool exchange(
bool v, etl::memory_order
order = etl::memory_order_seq_cst)
volatile
795 atomic& operator =(
const atomic&) ETL_DELETE;
796 atomic& operator =(
const atomic&)
volatile ETL_DELETE;
805 template <
typename T>
830 T operator =(
T v)
volatile
847 operator T()
volatile const
868 void store(
T v, etl::memory_order
order = etl::memory_order_seq_cst)
876 void store(
T v, etl::memory_order
order = etl::memory_order_seq_cst)
volatile
885 T load(etl::memory_order
order = etl::memory_order_seq_cst)
const volatile
896 T load(etl::memory_order
order = etl::memory_order_seq_cst)
const
918 T exchange(
T v, etl::memory_order
order = etl::memory_order_seq_cst)
volatile
936 if (
memcmp(&value, &expected,
sizeof(
T)) == 0)
956 if (
memcmp(&value, &expected,
sizeof(
T)) == 0)
1017#undef ETL_BUILTIN_LOCK
1018#undef ETL_BUILTIN_UNLOCK
1022#if defined(ETL_USE_SYNC_BUILTINS)
1024#define ETL_BUILTIN_LOCK while (__sync_lock_test_and_set(&flag, 1U)) {}
1025#define ETL_BUILTIN_UNLOCK __sync_lock_release(&flag);
1032 typedef enum memory_order
1034 memory_order_relaxed,
1035 memory_order_consume,
1036 memory_order_acquire,
1037 memory_order_release,
1038 memory_order_acq_rel,
1039 memory_order_seq_cst
1042 template <
bool Is_Always_Lock_Free>
1048 template <
bool Is_Always_Lock_Free>
1049 ETL_CONSTANT
bool atomic_traits<Is_Always_Lock_Free>::is_always_lock_free;
1079 T operator =(
T v)
volatile
1092 T operator ++()
volatile
1103 T operator ++(
int)
volatile
1114 T operator --()
volatile
1125 T operator --(
int)
volatile
1136 T operator +=(
T v)
volatile
1147 T operator -=(
T v)
volatile
1191 operator T()
volatile const
1208 void store(
T v, etl::memory_order
order = etl::memory_order_seq_cst)
1214 void store(
T v, etl::memory_order
order = etl::memory_order_seq_cst)
volatile
1221 T load(etl::memory_order
order = etl::memory_order_seq_cst)
const
1227 T load(etl::memory_order
order = etl::memory_order_seq_cst)
const volatile
1266 T fetch_or(
T v, etl::memory_order
order = etl::memory_order_seq_cst)
volatile
1305 T exchange(
T v, etl::memory_order
order = etl::memory_order_seq_cst)
volatile
1317 if (
old == expected)
1333 if (
old == expected)
1350 if (
old == expected)
1367 if (
old == expected)
1451 atomic& operator =(
const atomic&) ETL_DELETE;
1452 atomic& operator =(
const atomic&)
volatile ETL_DELETE;
1454 mutable volatile T value;
1460 template <
typename T>
1483 T* operator =(
T*
v)
volatile
1496 T* operator ++()
volatile
1507 T* operator ++(
int)
volatile
1518 T* operator --()
volatile
1529 T* operator --(
int)
volatile
1557 operator T* ()
const
1562 operator T* ()
volatile const
1579 void store(
T*
v, etl::memory_order
order = etl::memory_order_seq_cst)
1584 void store(
T*
v, etl::memory_order
order = etl::memory_order_seq_cst)
volatile
1590 T*
load(etl::memory_order
order = etl::memory_order_seq_cst)
const
1595 T*
load(etl::memory_order
order = etl::memory_order_seq_cst)
const volatile
1628 T*
exchange(
T*
v, etl::memory_order
order = etl::memory_order_seq_cst)
volatile
1638 if (
old == expected)
1653 if (
old == expected)
1668 if (
old == expected)
1683 if (
old == expected)
1761 atomic& operator =(
const atomic&) ETL_DELETE;
1762 atomic& operator =(
const atomic&)
volatile ETL_DELETE;
1786 bool operator =(
bool v)
1793 bool operator =(
bool v)
volatile
1801 operator bool()
const
1806 operator bool()
volatile const
1823 void store(
bool v, etl::memory_order
order = etl::memory_order_seq_cst)
1828 void store(
bool v, etl::memory_order
order = etl::memory_order_seq_cst)
volatile
1834 bool load(etl::memory_order
order = etl::memory_order_seq_cst)
const
1839 bool load(etl::memory_order
order = etl::memory_order_seq_cst)
const volatile
1845 bool exchange(
bool v, etl::memory_order
order = etl::memory_order_seq_cst)
1850 bool exchange(
bool v, etl::memory_order
order = etl::memory_order_seq_cst)
volatile
1860 if (
old == expected)
1875 if (
old == expected)
1890 if (
old == expected)
1905 if (
old == expected)
1919 bool old = expected;
1923 if (
memcmp(&
old, &expected,
sizeof(
bool)))
1935 bool old = expected;
1939 if (
memcmp(&
old, &expected,
sizeof(
bool)))
1951 bool old = expected;
1955 if (
memcmp(&
old, &expected,
sizeof(
bool)))
1967 bool old = expected;
1971 if (
memcmp(&
old, &expected,
sizeof(
bool)))
1983 atomic& operator =(
const atomic&) ETL_DELETE;
1984 atomic& operator =(
const atomic&)
volatile ETL_DELETE;
1993 template <
typename T>
2018 T operator =(
T v)
volatile
2035 operator T()
volatile const
2056 void store(
T v, etl::memory_order
order = etl::memory_order_seq_cst)
2063 void store(
T v, etl::memory_order
order = etl::memory_order_seq_cst)
volatile
2071 T load(etl::memory_order
order = etl::memory_order_seq_cst)
const volatile
2081 T load(etl::memory_order
order = etl::memory_order_seq_cst)
const
2101 T exchange(
T v, etl::memory_order
order = etl::memory_order_seq_cst)
volatile
2117 if (
memcmp(&value, &expected,
sizeof(
T)) == 0)
2136 if (
memcmp(&value, &expected,
sizeof(
T)) == 0)
2187#undef ETL_SYNC_BUILTIN_LOCK
2188#undef ETL_SYNC_BUILTIN_UNLOCK
2192 typedef etl::atomic<bool> atomic_bool;
2193 typedef etl::atomic<char> atomic_char;
2194 typedef etl::atomic<signed char> atomic_schar;
2195 typedef etl::atomic<unsigned char> atomic_uchar;
2196 typedef etl::atomic<short> atomic_short;
2197 typedef etl::atomic<unsigned short> atomic_ushort;
2198 typedef etl::atomic<int> atomic_int;
2199 typedef etl::atomic<unsigned int> atomic_uint;
2200 typedef etl::atomic<long> atomic_long;
2201 typedef etl::atomic<unsigned long> atomic_ulong;
2202 typedef etl::atomic<long long> atomic_llong;
2203 typedef etl::atomic<unsigned long long> atomic_ullong;
2204 typedef etl::atomic<wchar_t> atomic_wchar_t;
2205#if ETL_HAS_NATIVE_CHAR8_T
2208#if ETL_HAS_NATIVE_CHAR16_T
2211#if ETL_HAS_NATIVE_CHAR32_T
2214#if ETL_USING_8BIT_TYPES
2218 typedef etl::atomic<uint16_t> atomic_uint16_t;
2219 typedef etl::atomic<int16_t> atomic_int16_t;
2220 typedef etl::atomic<uint32_t> atomic_uint32_t;
2221 typedef etl::atomic<int32_t> atomic_int32_t;
2222#if ETL_USING_64BIT_TYPES
2223 typedef etl::atomic<uint64_t> atomic_uint64_t;
2224 typedef etl::atomic<int64_t> atomic_int64_t;
2226 typedef etl::atomic<int_least8_t> atomic_int_least8_t;
2227 typedef etl::atomic<uint_least8_t> atomic_uint_least8_t;
2228 typedef etl::atomic<int_least16_t> atomic_int_least16_t;
2229 typedef etl::atomic<uint_least16_t> atomic_uint_least16_t;
2230 typedef etl::atomic<int_least32_t> atomic_int_least32_t;
2231 typedef etl::atomic<uint_least32_t> atomic_uint_least32_t;
2232#if ETL_USING_64BIT_TYPES
2233 typedef etl::atomic<int_least64_t> atomic_int_least64_t;
2234 typedef etl::atomic<uint_least64_t> atomic_uint_least64_t;
2236 typedef etl::atomic<int_fast8_t> atomic_int_fast8_t;
2237 typedef etl::atomic<uint_fast8_t> atomic_uint_fast8_t;
2238 typedef etl::atomic<int_fast16_t> atomic_int_fast16_t;
2239 typedef etl::atomic<uint_fast16_t> atomic_uint_fast16_t;
2240 typedef etl::atomic<int_fast32_t> atomic_int_fast32_t;
2241 typedef etl::atomic<uint_fast32_t> atomic_uint_fast32_t;
2242#if ETL_USING_64BIT_TYPES
2243 typedef etl::atomic<int_fast64_t> atomic_int_fast64_t;
2244 typedef etl::atomic<uint_fast64_t> atomic_uint_fast64_t;
2246 typedef etl::atomic<intptr_t> atomic_intptr_t;
2247 typedef etl::atomic<uintptr_t> atomic_uintptr_t;
2248 typedef etl::atomic<size_t> atomic_size_t;
2249 typedef etl::atomic<ptrdiff_t> atomic_ptrdiff_t;
2250 typedef etl::atomic<intmax_t> atomic_intmax_t;
2251 typedef etl::atomic<uintmax_t> atomic_uintmax_t;
is_integral
Definition type_traits_generator.h:1040
bitset_ext
Definition absolute.h:38
T exchange(T &object, const T &new_value)
exchange (const)
Definition utility.h:493
etl::byte & operator^=(etl::byte &lhs, etl::byte rhs)
Exclusive or equals.
Definition byte.h:305
etl::byte & operator|=(etl::byte &lhs, etl::byte rhs)
Or equals.
Definition byte.h:289
etl::byte & operator&=(etl::byte &lhs, etl::byte rhs)
And equals.
Definition byte.h:297
ETL_NODISCARD ETL_CONSTEXPR14 T round_half_even_unscaled(T value) ETL_NOEXCEPT
Definition scaled_rounding.h:314