8#include <QtCore/qgenericatomic.h>
16#pragma qt_sync_skip_header_check
17#pragma qt_sync_stop_processing
40#define Q_ATOMIC_INT32_IS_SUPPORTED
41#if ATOMIC_INT_LOCK_FREE == 2
42# define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_ALWAYS_NATIVE
43# define Q_ATOMIC_INT_TEST_AND_SET_IS_ALWAYS_NATIVE
44# define Q_ATOMIC_INT_FETCH_AND_STORE_IS_ALWAYS_NATIVE
45# define Q_ATOMIC_INT_FETCH_AND_ADD_IS_ALWAYS_NATIVE
46# define Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_ALWAYS_NATIVE
47# define Q_ATOMIC_INT32_TEST_AND_SET_IS_ALWAYS_NATIVE
48# define Q_ATOMIC_INT32_FETCH_AND_STORE_IS_ALWAYS_NATIVE
49# define Q_ATOMIC_INT32_FETCH_AND_ADD_IS_ALWAYS_NATIVE
53#elif ATOMIC_INT_LOCK_FREE == 1
54# define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE
55# define Q_ATOMIC_INT_TEST_AND_SET_IS_SOMETIMES_NATIVE
56# define Q_ATOMIC_INT_FETCH_AND_STORE_IS_SOMETIMES_NATIVE
57# define Q_ATOMIC_INT_FETCH_AND_ADD_IS_SOMETIMES_NATIVE
58# define Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE
59# define Q_ATOMIC_INT32_TEST_AND_SET_IS_SOMETIMES_NATIVE
60# define Q_ATOMIC_INT32_FETCH_AND_STORE_IS_SOMETIMES_NATIVE
61# define Q_ATOMIC_INT32_FETCH_AND_ADD_IS_SOMETIMES_NATIVE
66# define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_NEVER_NATIVE
67# define Q_ATOMIC_INT_TEST_AND_SET_IS_NEVER_NATIVE
68# define Q_ATOMIC_INT_FETCH_AND_STORE_IS_NEVER_NATIVE
69# define Q_ATOMIC_INT_FETCH_AND_ADD_IS_NEVER_NATIVE
70# define Q_ATOMIC_INT32_REFERENCE_COUNTING_IS_NEVER_NATIVE
71# define Q_ATOMIC_INT32_TEST_AND_SET_IS_NEVER_NATIVE
72# define Q_ATOMIC_INT32_FETCH_AND_STORE_IS_NEVER_NATIVE
73# define Q_ATOMIC_INT32_FETCH_AND_ADD_IS_NEVER_NATIVE
79#if ATOMIC_POINTER_LOCK_FREE == 2
80# define Q_ATOMIC_POINTER_REFERENCE_COUNTING_IS_ALWAYS_NATIVE
81# define Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE
82# define Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_ALWAYS_NATIVE
83# define Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_ALWAYS_NATIVE
84#elif ATOMIC_POINTER_LOCK_FREE == 1
85# define Q_ATOMIC_POINTER_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE
86# define Q_ATOMIC_POINTER_TEST_AND_SET_IS_SOMETIMES_NATIVE
87# define Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_SOMETIMES_NATIVE
88# define Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_SOMETIMES_NATIVE
90# define Q_ATOMIC_POINTER_REFERENCE_COUNTING_IS_NEVER_NATIVE
91# define Q_ATOMIC_POINTER_TEST_AND_SET_IS_NEVER_NATIVE
92# define Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_NEVER_NATIVE
93# define Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_NEVER_NATIVE
97#define Q_ATOMIC_INT8_IS_SUPPORTED
98#if ATOMIC_CHAR_LOCK_FREE == 2
99# define Q_ATOMIC_INT8_REFERENCE_COUNTING_IS_ALWAYS_NATIVE
100# define Q_ATOMIC_INT8_TEST_AND_SET_IS_ALWAYS_NATIVE
101# define Q_ATOMIC_INT8_FETCH_AND_STORE_IS_ALWAYS_NATIVE
102# define Q_ATOMIC_INT8_FETCH_AND_ADD_IS_ALWAYS_NATIVE
106#elif ATOMIC_CHAR_LOCK_FREE == 1
107# define Q_ATOMIC_INT8_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE
108# define Q_ATOMIC_INT8_TEST_AND_SET_IS_SOMETIMES_NATIVE
109# define Q_ATOMIC_INT8_FETCH_AND_STORE_IS_SOMETIMES_NATIVE
110# define Q_ATOMIC_INT8_FETCH_AND_ADD_IS_SOMETIMES_NATIVE
115# define Q_ATOMIC_INT8_REFERENCE_COUNTING_IS_NEVER_NATIVE
116# define Q_ATOMIC_INT8_TEST_AND_SET_IS_NEVER_NATIVE
117# define Q_ATOMIC_INT8_FETCH_AND_STORE_IS_NEVER_NATIVE
118# define Q_ATOMIC_INT8_FETCH_AND_ADD_IS_NEVER_NATIVE
125#define Q_ATOMIC_INT16_IS_SUPPORTED
126#if ATOMIC_SHORT_LOCK_FREE == 2
127# define Q_ATOMIC_INT16_REFERENCE_COUNTING_IS_ALWAYS_NATIVE
128# define Q_ATOMIC_INT16_TEST_AND_SET_IS_ALWAYS_NATIVE
129# define Q_ATOMIC_INT16_FETCH_AND_STORE_IS_ALWAYS_NATIVE
130# define Q_ATOMIC_INT16_FETCH_AND_ADD_IS_ALWAYS_NATIVE
134#elif ATOMIC_SHORT_LOCK_FREE == 1
135# define Q_ATOMIC_INT16_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE
136# define Q_ATOMIC_INT16_TEST_AND_SET_IS_SOMETIMES_NATIVE
137# define Q_ATOMIC_INT16_FETCH_AND_STORE_IS_SOMETIMES_NATIVE
138# define Q_ATOMIC_INT16_FETCH_AND_ADD_IS_SOMETIMES_NATIVE
143# define Q_ATOMIC_INT16_REFERENCE_COUNTING_IS_NEVER_NATIVE
144# define Q_ATOMIC_INT16_TEST_AND_SET_IS_NEVER_NATIVE
145# define Q_ATOMIC_INT16_FETCH_AND_STORE_IS_NEVER_NATIVE
146# define Q_ATOMIC_INT16_FETCH_AND_ADD_IS_NEVER_NATIVE
152#if !defined(QT_BOOTSTRAPPED) && QT_CONFIG(std_atomic64)
154# define Q_ATOMIC_INT64_IS_SUPPORTED
155# if ATOMIC_LLONG_LOCK_FREE == 2
156# define Q_ATOMIC_INT64_REFERENCE_COUNTING_IS_ALWAYS_NATIVE
157# define Q_ATOMIC_INT64_TEST_AND_SET_IS_ALWAYS_NATIVE
158# define Q_ATOMIC_INT64_FETCH_AND_STORE_IS_ALWAYS_NATIVE
159# define Q_ATOMIC_INT64_FETCH_AND_ADD_IS_ALWAYS_NATIVE
163# elif ATOMIC_LLONG_LOCK_FREE == 1
164# define Q_ATOMIC_INT64_REFERENCE_COUNTING_IS_SOMETIMES_NATIVE
165# define Q_ATOMIC_INT64_TEST_AND_SET_IS_SOMETIMES_NATIVE
166# define Q_ATOMIC_INT64_FETCH_AND_STORE_IS_SOMETIMES_NATIVE
167# define Q_ATOMIC_INT64_FETCH_AND_ADD_IS_SOMETIMES_NATIVE
172# define Q_ATOMIC_INT64_REFERENCE_COUNTING_IS_NEVER_NATIVE
173# define Q_ATOMIC_INT64_TEST_AND_SET_IS_NEVER_NATIVE
174# define Q_ATOMIC_INT64_FETCH_AND_STORE_IS_NEVER_NATIVE
175# define Q_ATOMIC_INT64_FETCH_AND_ADD_IS_NEVER_NATIVE
186 template <
typename T>
static inline
187 T
load(
const std::atomic<T> &_q_value)
noexcept
189 return _q_value.load(std::memory_order_relaxed);
192 template <
typename T>
static inline
193 T
load(
const volatile std::atomic<T> &_q_value)
noexcept
195 return _q_value.load(std::memory_order_relaxed);
198 template <
typename T>
static inline
201 return _q_value.load(std::memory_order_relaxed);
204 template <
typename T>
static inline
207 return _q_value.load(std::memory_order_relaxed);
210 template <
typename T>
static inline
213 return _q_value.load(std::memory_order_acquire);
216 template <
typename T>
static inline
219 return _q_value.load(std::memory_order_acquire);
222 template <
typename T>
static inline
223 void store(std::atomic<T> &_q_value, T newValue)
noexcept
225 _q_value.store(newValue, std::memory_order_relaxed);
228 template <
typename T>
static inline
231 _q_value.store(newValue, std::memory_order_relaxed);
234 template <
typename T>
static inline
237 _q_value.store(newValue, std::memory_order_release);
242 template <
typename T>
243 static inline bool ref(std::atomic<T> &_q_value)
258 return _q_value.fetch_add(1, std::memory_order_acq_rel) != T(-1);
261 template <
typename T>
262 static inline bool deref(std::atomic<T> &_q_value)
noexcept
265 return _q_value.fetch_sub(1, std::memory_order_acq_rel) != T(1);
272 template <
typename T>
275 bool tmp = _q_value.compare_exchange_strong(expectedValue, newValue, std::memory_order_relaxed, std::memory_order_relaxed);
281 template <
typename T>
284 bool tmp = _q_value.compare_exchange_strong(expectedValue, newValue, std::memory_order_acquire, std::memory_order_acquire);
290 template <
typename T>
293 bool tmp = _q_value.compare_exchange_strong(expectedValue, newValue, std::memory_order_release, std::memory_order_relaxed);
299 template <
typename T>
302 bool tmp = _q_value.compare_exchange_strong(expectedValue, newValue, std::memory_order_acq_rel, std::memory_order_acquire);
311 template <
typename T>
314 return _q_value.exchange(newValue, std::memory_order_relaxed);
317 template <
typename T>
320 return _q_value.exchange(newValue, std::memory_order_acquire);
323 template <
typename T>
326 return _q_value.exchange(newValue, std::memory_order_release);
329 template <
typename T>
332 return _q_value.exchange(newValue, std::memory_order_acq_rel);
338 template <
typename T>
static inline
341 return _q_value.fetch_add(valueToAdd, std::memory_order_relaxed);
344 template <
typename T>
static inline
347 return _q_value.fetch_add(valueToAdd, std::memory_order_acquire);
350 template <
typename T>
static inline
353 return _q_value.fetch_add(valueToAdd, std::memory_order_release);
356 template <
typename T>
static inline
359 return _q_value.fetch_add(valueToAdd, std::memory_order_acq_rel);
362 template <
typename T>
static inline
365 return _q_value.fetch_sub(valueToAdd, std::memory_order_relaxed);
368 template <
typename T>
static inline
371 return _q_value.fetch_sub(valueToAdd, std::memory_order_acquire);
374 template <
typename T>
static inline
377 return _q_value.fetch_sub(valueToAdd, std::memory_order_release);
380 template <
typename T>
static inline
383 return _q_value.fetch_sub(valueToAdd, std::memory_order_acq_rel);
386 template <
typename T>
static inline
389 return _q_value.fetch_and(valueToAdd, std::memory_order_relaxed);
392 template <
typename T>
static inline
395 return _q_value.fetch_and(valueToAdd, std::memory_order_acquire);
398 template <
typename T>
static inline
401 return _q_value.fetch_and(valueToAdd, std::memory_order_release);
404 template <
typename T>
static inline
407 return _q_value.fetch_and(valueToAdd, std::memory_order_acq_rel);
410 template <
typename T>
static inline
413 return _q_value.fetch_or(valueToAdd, std::memory_order_relaxed);
416 template <
typename T>
static inline
419 return _q_value.fetch_or(valueToAdd, std::memory_order_acquire);
422 template <
typename T>
static inline
425 return _q_value.fetch_or(valueToAdd, std::memory_order_release);
428 template <
typename T>
static inline
431 return _q_value.fetch_or(valueToAdd, std::memory_order_acq_rel);
434 template <
typename T>
static inline
437 return _q_value.fetch_xor(valueToAdd, std::memory_order_relaxed);
440 template <
typename T>
static inline
443 return _q_value.fetch_xor(valueToAdd, std::memory_order_acquire);
446 template <
typename T>
static inline
449 return _q_value.fetch_xor(valueToAdd, std::memory_order_release);
452 template <
typename T>
static inline
455 return _q_value.fetch_xor(valueToAdd, std::memory_order_acq_rel);
459# 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