8#include <QtCore/qgenericatomic.h>
9#include <QtCore/qyieldcpu.h>
17#pragma qt_sync_skip_header_check
18#pragma qt_sync_stop_processing
41#define Q_ATOMIC_INT32_IS_SUPPORTED
42#if ATOMIC_INT_LOCK_FREE == 2
43# define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_ALWAYS_NATIVE
44# define Q_ATOMIC_INT_TEST_AND_SET_IS_ALWAYS_NATIVE
45# define Q_ATOMIC_INT_FETCH_AND_STORE_IS_ALWAYS_NATIVE
46# define Q_ATOMIC_INT_FETCH_AND_ADD_IS_ALWAYS_NATIVE
47# define Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_ALWAYS_NATIVE
48# define Q_ATOMIC_INT32_TEST_AND_SET_IS_ALWAYS_NATIVE
49# define Q_ATOMIC_INT32_FETCH_AND_STORE_IS_ALWAYS_NATIVE
50# define Q_ATOMIC_INT32_FETCH_AND_ADD_IS_ALWAYS_NATIVE
54#elif ATOMIC_INT_LOCK_FREE == 1
55# define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE
56# define Q_ATOMIC_INT_TEST_AND_SET_IS_SOMETIMES_NATIVE
57# define Q_ATOMIC_INT_FETCH_AND_STORE_IS_SOMETIMES_NATIVE
58# define Q_ATOMIC_INT_FETCH_AND_ADD_IS_SOMETIMES_NATIVE
59# define Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE
60# define Q_ATOMIC_INT32_TEST_AND_SET_IS_SOMETIMES_NATIVE
61# define Q_ATOMIC_INT32_FETCH_AND_STORE_IS_SOMETIMES_NATIVE
62# define Q_ATOMIC_INT32_FETCH_AND_ADD_IS_SOMETIMES_NATIVE
67# define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_NEVER_NATIVE
68# define Q_ATOMIC_INT_TEST_AND_SET_IS_NEVER_NATIVE
69# define Q_ATOMIC_INT_FETCH_AND_STORE_IS_NEVER_NATIVE
70# define Q_ATOMIC_INT_FETCH_AND_ADD_IS_NEVER_NATIVE
71# define Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_NEVER_NATIVE
72# define Q_ATOMIC_INT32_TEST_AND_SET_IS_NEVER_NATIVE
73# define Q_ATOMIC_INT32_FETCH_AND_STORE_IS_NEVER_NATIVE
74# define Q_ATOMIC_INT32_FETCH_AND_ADD_IS_NEVER_NATIVE
80#if ATOMIC_POINTER_LOCK_FREE == 2
81# define Q_ATOMIC_POINTER_REFERENCE_COUNTING_IS_ALWAYS_NATIVE
82# define Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE
83# define Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_ALWAYS_NATIVE
84# define Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_ALWAYS_NATIVE
85#elif ATOMIC_POINTER_LOCK_FREE == 1
86# define Q_ATOMIC_POINTER_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE
87# define Q_ATOMIC_POINTER_TEST_AND_SET_IS_SOMETIMES_NATIVE
88# define Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_SOMETIMES_NATIVE
89# define Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_SOMETIMES_NATIVE
91# define Q_ATOMIC_POINTER_REFERENCE_COUNTING_IS_NEVER_NATIVE
92# define Q_ATOMIC_POINTER_TEST_AND_SET_IS_NEVER_NATIVE
93# define Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_NEVER_NATIVE
94# define Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_NEVER_NATIVE
98#define Q_ATOMIC_INT8_IS_SUPPORTED
99#if ATOMIC_CHAR_LOCK_FREE == 2
100# define Q_ATOMIC_INT8_REFERENCE_COUNTING_IS_ALWAYS_NATIVE
101# define Q_ATOMIC_INT8_TEST_AND_SET_IS_ALWAYS_NATIVE
102# define Q_ATOMIC_INT8_FETCH_AND_STORE_IS_ALWAYS_NATIVE
103# define Q_ATOMIC_INT8_FETCH_AND_ADD_IS_ALWAYS_NATIVE
107#elif ATOMIC_CHAR_LOCK_FREE == 1
108# define Q_ATOMIC_INT8_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE
109# define Q_ATOMIC_INT8_TEST_AND_SET_IS_SOMETIMES_NATIVE
110# define Q_ATOMIC_INT8_FETCH_AND_STORE_IS_SOMETIMES_NATIVE
111# define Q_ATOMIC_INT8_FETCH_AND_ADD_IS_SOMETIMES_NATIVE
116# define Q_ATOMIC_INT8_REFERENCE_COUNTING_IS_NEVER_NATIVE
117# define Q_ATOMIC_INT8_TEST_AND_SET_IS_NEVER_NATIVE
118# define Q_ATOMIC_INT8_FETCH_AND_STORE_IS_NEVER_NATIVE
119# define Q_ATOMIC_INT8_FETCH_AND_ADD_IS_NEVER_NATIVE
126#define Q_ATOMIC_INT16_IS_SUPPORTED
127#if ATOMIC_SHORT_LOCK_FREE == 2
128# define Q_ATOMIC_INT16_REFERENCE_COUNTING_IS_ALWAYS_NATIVE
129# define Q_ATOMIC_INT16_TEST_AND_SET_IS_ALWAYS_NATIVE
130# define Q_ATOMIC_INT16_FETCH_AND_STORE_IS_ALWAYS_NATIVE
131# define Q_ATOMIC_INT16_FETCH_AND_ADD_IS_ALWAYS_NATIVE
135#elif ATOMIC_SHORT_LOCK_FREE == 1
136# define Q_ATOMIC_INT16_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE
137# define Q_ATOMIC_INT16_TEST_AND_SET_IS_SOMETIMES_NATIVE
138# define Q_ATOMIC_INT16_FETCH_AND_STORE_IS_SOMETIMES_NATIVE
139# define Q_ATOMIC_INT16_FETCH_AND_ADD_IS_SOMETIMES_NATIVE
144# define Q_ATOMIC_INT16_REFERENCE_COUNTING_IS_NEVER_NATIVE
145# define Q_ATOMIC_INT16_TEST_AND_SET_IS_NEVER_NATIVE
146# define Q_ATOMIC_INT16_FETCH_AND_STORE_IS_NEVER_NATIVE
147# define Q_ATOMIC_INT16_FETCH_AND_ADD_IS_NEVER_NATIVE
153#if !defined(QT_BOOTSTRAPPED) && QT_CONFIG(std_atomic64)
155# define Q_ATOMIC_INT64_IS_SUPPORTED
156# if ATOMIC_LLONG_LOCK_FREE == 2
157# define Q_ATOMIC_INT64_REFERENCE_COUNTING_IS_ALWAYS_NATIVE
158# define Q_ATOMIC_INT64_TEST_AND_SET_IS_ALWAYS_NATIVE
159# define Q_ATOMIC_INT64_FETCH_AND_STORE_IS_ALWAYS_NATIVE
160# define Q_ATOMIC_INT64_FETCH_AND_ADD_IS_ALWAYS_NATIVE
164# elif ATOMIC_LLONG_LOCK_FREE == 1
165# define Q_ATOMIC_INT64_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE
166# define Q_ATOMIC_INT64_TEST_AND_SET_IS_SOMETIMES_NATIVE
167# define Q_ATOMIC_INT64_FETCH_AND_STORE_IS_SOMETIMES_NATIVE
168# define Q_ATOMIC_INT64_FETCH_AND_ADD_IS_SOMETIMES_NATIVE
173# define Q_ATOMIC_INT64_REFERENCE_COUNTING_IS_NEVER_NATIVE
174# define Q_ATOMIC_INT64_TEST_AND_SET_IS_NEVER_NATIVE
175# define Q_ATOMIC_INT64_FETCH_AND_STORE_IS_NEVER_NATIVE
176# define Q_ATOMIC_INT64_FETCH_AND_ADD_IS_NEVER_NATIVE
187 template <
typename T>
static inline
188 T
load(
const std::atomic<T> &_q_value)
noexcept
190 return _q_value.load(std::memory_order_relaxed);
193 template <
typename T>
static inline
194 T
load(
const volatile std::atomic<T> &_q_value)
noexcept
196 return _q_value.load(std::memory_order_relaxed);
199 template <
typename T>
static inline
202 return _q_value.load(std::memory_order_relaxed);
205 template <
typename T>
static inline
208 return _q_value.load(std::memory_order_relaxed);
211 template <
typename T>
static inline
214 return _q_value.load(std::memory_order_acquire);
217 template <
typename T>
static inline
220 return _q_value.load(std::memory_order_acquire);
223 template <
typename T>
static inline
224 void store(std::atomic<T> &_q_value, T newValue)
noexcept
226 _q_value.store(newValue, std::memory_order_relaxed);
229 template <
typename T>
static inline
232 _q_value.store(newValue, std::memory_order_relaxed);
235 template <
typename T>
static inline
238 _q_value.store(newValue, std::memory_order_release);
243 template <
typename T>
244 static inline bool ref(std::atomic<T> &_q_value)
259 return _q_value.fetch_add(1, std::memory_order_acq_rel) != T(-1);
262 template <
typename T>
263 static inline bool deref(std::atomic<T> &_q_value)
noexcept
266 return _q_value.fetch_sub(1, std::memory_order_acq_rel) != T(1);
273 template <
typename T>
276 bool tmp = _q_value.compare_exchange_strong(expectedValue, newValue, std::memory_order_relaxed, std::memory_order_relaxed);
282 template <
typename T>
285 bool tmp = _q_value.compare_exchange_strong(expectedValue, newValue, std::memory_order_acquire, std::memory_order_acquire);
291 template <
typename T>
294 bool tmp = _q_value.compare_exchange_strong(expectedValue, newValue, std::memory_order_release, std::memory_order_relaxed);
300 template <
typename T>
303 bool tmp = _q_value.compare_exchange_strong(expectedValue, newValue, std::memory_order_acq_rel, std::memory_order_acquire);
312 template <
typename T>
315 return _q_value.exchange(newValue, std::memory_order_relaxed);
318 template <
typename T>
321 return _q_value.exchange(newValue, std::memory_order_acquire);
324 template <
typename T>
327 return _q_value.exchange(newValue, std::memory_order_release);
330 template <
typename T>
333 return _q_value.exchange(newValue, std::memory_order_acq_rel);
339 template <
typename T>
static inline
342 return _q_value.fetch_add(valueToAdd, std::memory_order_relaxed);
345 template <
typename T>
static inline
348 return _q_value.fetch_add(valueToAdd, std::memory_order_acquire);
351 template <
typename T>
static inline
354 return _q_value.fetch_add(valueToAdd, std::memory_order_release);
357 template <
typename T>
static inline
360 return _q_value.fetch_add(valueToAdd, std::memory_order_acq_rel);
363 template <
typename T>
static inline
366 return _q_value.fetch_sub(valueToAdd, std::memory_order_relaxed);
369 template <
typename T>
static inline
372 return _q_value.fetch_sub(valueToAdd, std::memory_order_acquire);
375 template <
typename T>
static inline
378 return _q_value.fetch_sub(valueToAdd, std::memory_order_release);
381 template <
typename T>
static inline
384 return _q_value.fetch_sub(valueToAdd, std::memory_order_acq_rel);
387 template <
typename T>
static inline
390 return _q_value.fetch_and(valueToAdd, std::memory_order_relaxed);
393 template <
typename T>
static inline
396 return _q_value.fetch_and(valueToAdd, std::memory_order_acquire);
399 template <
typename T>
static inline
402 return _q_value.fetch_and(valueToAdd, std::memory_order_release);
405 template <
typename T>
static inline
408 return _q_value.fetch_and(valueToAdd, std::memory_order_acq_rel);
411 template <
typename T>
static inline
414 return _q_value.fetch_or(valueToAdd, std::memory_order_relaxed);
417 template <
typename T>
static inline
420 return _q_value.fetch_or(valueToAdd, std::memory_order_acquire);
423 template <
typename T>
static inline
426 return _q_value.fetch_or(valueToAdd, std::memory_order_release);
429 template <
typename T>
static inline
432 return _q_value.fetch_or(valueToAdd, std::memory_order_acq_rel);
435 template <
typename T>
static inline
438 return _q_value.fetch_xor(valueToAdd, std::memory_order_relaxed);
441 template <
typename T>
static inline
444 return _q_value.fetch_xor(valueToAdd, std::memory_order_acquire);
447 template <
typename T>
static inline
450 return _q_value.fetch_xor(valueToAdd, std::memory_order_release);
453 template <
typename T>
static inline
456 return _q_value.fetch_xor(valueToAdd, std::memory_order_acq_rel);
460# define Q_BASIC_ATOMIC_INITIALIZER(a) { a }
Combined button and popup list for selecting options.
static void storeRelease(std::atomic< T > &_q_value, T newValue) noexcept
static bool isFetchAndAddNative() noexcept
static constexpr bool isFetchAndStoreWaitFree() noexcept
static T fetchAndOrOrdered(std::atomic< T > &_q_value, typename QAtomicAdditiveType< T >::AdditiveT valueToAdd) noexcept
static T fetchAndOrAcquire(std::atomic< T > &_q_value, typename QAtomicAdditiveType< T >::AdditiveT valueToAdd) noexcept
static T fetchAndSubOrdered(std::atomic< T > &_q_value, typename QAtomicAdditiveType< T >::AdditiveT valueToAdd) noexcept
static T fetchAndStoreRelaxed(std::atomic< T > &_q_value, T newValue) noexcept
static T fetchAndAddAcquire(std::atomic< T > &_q_value, typename QAtomicAdditiveType< T >::AdditiveT valueToAdd) noexcept
static T fetchAndSubRelaxed(std::atomic< T > &_q_value, typename QAtomicAdditiveType< T >::AdditiveT valueToAdd) noexcept
static T fetchAndAndRelaxed(std::atomic< T > &_q_value, typename QAtomicAdditiveType< T >::AdditiveT valueToAdd) noexcept
static bool isReferenceCountingNative() noexcept
static bool testAndSetOrdered(std::atomic< T > &_q_value, T expectedValue, T newValue, T *currentValue=nullptr) noexcept
static T fetchAndAddOrdered(std::atomic< T > &_q_value, typename QAtomicAdditiveType< T >::AdditiveT valueToAdd) noexcept
static T fetchAndStoreOrdered(std::atomic< T > &_q_value, T newValue) noexcept
static bool ref(std::atomic< T > &_q_value)
static T fetchAndXorOrdered(std::atomic< T > &_q_value, typename QAtomicAdditiveType< T >::AdditiveT valueToAdd) noexcept
static constexpr bool isFetchAndAddWaitFree() noexcept
static T fetchAndAddRelease(std::atomic< T > &_q_value, typename QAtomicAdditiveType< T >::AdditiveT valueToAdd) noexcept
static T loadRelaxed(const volatile std::atomic< T > &_q_value) noexcept
static T fetchAndAndRelease(std::atomic< T > &_q_value, typename QAtomicAdditiveType< T >::AdditiveT valueToAdd) noexcept
static bool testAndSetRelease(std::atomic< T > &_q_value, T expectedValue, T newValue, T *currentValue=nullptr) noexcept
static T fetchAndStoreAcquire(std::atomic< T > &_q_value, T newValue) noexcept
static T fetchAndXorRelaxed(std::atomic< T > &_q_value, typename QAtomicAdditiveType< T >::AdditiveT valueToAdd) noexcept
static T fetchAndOrRelaxed(std::atomic< T > &_q_value, typename QAtomicAdditiveType< T >::AdditiveT valueToAdd) noexcept
static T fetchAndAndAcquire(std::atomic< T > &_q_value, typename QAtomicAdditiveType< T >::AdditiveT valueToAdd) noexcept
static bool isFetchAndStoreNative() noexcept
static bool deref(std::atomic< T > &_q_value) noexcept
static T loadRelaxed(const std::atomic< T > &_q_value) noexcept
static bool testAndSetRelaxed(std::atomic< T > &_q_value, T expectedValue, T newValue, T *currentValue=nullptr) noexcept
static bool isTestAndSetNative() noexcept
static T fetchAndXorRelease(std::atomic< T > &_q_value, typename QAtomicAdditiveType< T >::AdditiveT valueToAdd) noexcept
static void storeRelaxed(std::atomic< T > &_q_value, T newValue) noexcept
static T loadAcquire(const volatile std::atomic< T > &_q_value) noexcept
static T loadAcquire(const std::atomic< T > &_q_value) noexcept
static T load(const std::atomic< T > &_q_value) noexcept
static T fetchAndSubRelease(std::atomic< T > &_q_value, typename QAtomicAdditiveType< T >::AdditiveT valueToAdd) noexcept
static constexpr bool isTestAndSetWaitFree() noexcept
static T fetchAndAddRelaxed(std::atomic< T > &_q_value, typename QAtomicAdditiveType< T >::AdditiveT valueToAdd) noexcept
static T load(const volatile std::atomic< T > &_q_value) noexcept
static T fetchAndSubAcquire(std::atomic< T > &_q_value, typename QAtomicAdditiveType< T >::AdditiveT valueToAdd) noexcept
static void store(std::atomic< T > &_q_value, T newValue) noexcept
static T fetchAndStoreRelease(std::atomic< T > &_q_value, T newValue) noexcept
static T fetchAndAndOrdered(std::atomic< T > &_q_value, typename QAtomicAdditiveType< T >::AdditiveT valueToAdd) noexcept
static bool testAndSetAcquire(std::atomic< T > &_q_value, T expectedValue, T newValue, T *currentValue=nullptr) noexcept
static T fetchAndXorAcquire(std::atomic< T > &_q_value, typename QAtomicAdditiveType< T >::AdditiveT valueToAdd) noexcept
static T fetchAndOrRelease(std::atomic< T > &_q_value, typename QAtomicAdditiveType< T >::AdditiveT valueToAdd) noexcept
static constexpr bool isReferenceCountingWaitFree() noexcept