Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qbasicatomic.h
Go to the documentation of this file.
1// Copyright (C) 2011 Thiago Macieira <thiago@kde.org>
2// Copyright (C) 2018 Intel Corporation.
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
4
5#ifndef QBASICATOMIC_H
6#define QBASICATOMIC_H
7
8#include <QtCore/qatomic_cxx11.h>
9
10QT_WARNING_PUSH
11QT_WARNING_DISABLE_MSVC(4522)
12
13QT_BEGIN_NAMESPACE
14
15#if 0
16// silence syncqt warnings
17QT_END_NAMESPACE
18#pragma qt_no_master_include
19#pragma qt_sync_stop_processing
20#endif
21
22template <typename T>
23class QBasicAtomicInteger
24{
25public:
26 typedef T Type;
27 typedef QAtomicOps<T> Ops;
28 // static check that this is a valid integer
29 static_assert(std::is_integral_v<T>, "template parameter is not an integral type");
30 static_assert(QAtomicOpsSupport<sizeof(T)>::IsSupported, "template parameter is an integral of a size not supported on this platform");
31
32 typename Ops::Type _q_value;
33
34 // Everything below is either implemented in ../arch/qatomic_XXX.h or (as
35 // fallback) in qgenericatomic.h
36 T loadRelaxed() const noexcept { return Ops::loadRelaxed(_q_value); }
37 void storeRelaxed(T newValue) noexcept { Ops::storeRelaxed(_q_value, newValue); }
38
39 T loadAcquire() const noexcept { return Ops::loadAcquire(_q_value); }
40 void storeRelease(T newValue) noexcept { Ops::storeRelease(_q_value, newValue); }
41 operator T() const noexcept { return loadAcquire(); }
42 T operator=(T newValue) noexcept { storeRelease(newValue); return newValue; }
43
44 static constexpr bool isReferenceCountingNative() noexcept { return Ops::isReferenceCountingNative(); }
45 static constexpr bool isReferenceCountingWaitFree() noexcept { return Ops::isReferenceCountingWaitFree(); }
46
47 bool ref() noexcept { return Ops::ref(_q_value); }
48 bool deref() noexcept { return Ops::deref(_q_value); }
49
50 static constexpr bool isTestAndSetNative() noexcept { return Ops::isTestAndSetNative(); }
51 static constexpr bool isTestAndSetWaitFree() noexcept { return Ops::isTestAndSetWaitFree(); }
52
53 bool testAndSetRelaxed(T expectedValue, T newValue) noexcept
54 { return Ops::testAndSetRelaxed(_q_value, expectedValue, newValue); }
55 bool testAndSetAcquire(T expectedValue, T newValue) noexcept
56 { return Ops::testAndSetAcquire(_q_value, expectedValue, newValue); }
57 bool testAndSetRelease(T expectedValue, T newValue) noexcept
58 { return Ops::testAndSetRelease(_q_value, expectedValue, newValue); }
59 bool testAndSetOrdered(T expectedValue, T newValue) noexcept
60 { return Ops::testAndSetOrdered(_q_value, expectedValue, newValue); }
61
62 bool testAndSetRelaxed(T expectedValue, T newValue, T &currentValue) noexcept
63 { return Ops::testAndSetRelaxed(_q_value, expectedValue, newValue, &currentValue); }
64 bool testAndSetAcquire(T expectedValue, T newValue, T &currentValue) noexcept
65 { return Ops::testAndSetAcquire(_q_value, expectedValue, newValue, &currentValue); }
66 bool testAndSetRelease(T expectedValue, T newValue, T &currentValue) noexcept
67 { return Ops::testAndSetRelease(_q_value, expectedValue, newValue, &currentValue); }
68 bool testAndSetOrdered(T expectedValue, T newValue, T &currentValue) noexcept
69 { return Ops::testAndSetOrdered(_q_value, expectedValue, newValue, &currentValue); }
70
71 static constexpr bool isFetchAndStoreNative() noexcept { return Ops::isFetchAndStoreNative(); }
72 static constexpr bool isFetchAndStoreWaitFree() noexcept { return Ops::isFetchAndStoreWaitFree(); }
73
74 T fetchAndStoreRelaxed(T newValue) noexcept
75 { return Ops::fetchAndStoreRelaxed(_q_value, newValue); }
76 T fetchAndStoreAcquire(T newValue) noexcept
77 { return Ops::fetchAndStoreAcquire(_q_value, newValue); }
78 T fetchAndStoreRelease(T newValue) noexcept
79 { return Ops::fetchAndStoreRelease(_q_value, newValue); }
80 T fetchAndStoreOrdered(T newValue) noexcept
81 { return Ops::fetchAndStoreOrdered(_q_value, newValue); }
82
83 static constexpr bool isFetchAndAddNative() noexcept { return Ops::isFetchAndAddNative(); }
84 static constexpr bool isFetchAndAddWaitFree() noexcept { return Ops::isFetchAndAddWaitFree(); }
85
86 T fetchAndAddRelaxed(T valueToAdd) noexcept
87 { return Ops::fetchAndAddRelaxed(_q_value, valueToAdd); }
88 T fetchAndAddAcquire(T valueToAdd) noexcept
89 { return Ops::fetchAndAddAcquire(_q_value, valueToAdd); }
90 T fetchAndAddRelease(T valueToAdd) noexcept
91 { return Ops::fetchAndAddRelease(_q_value, valueToAdd); }
92 T fetchAndAddOrdered(T valueToAdd) noexcept
93 { return Ops::fetchAndAddOrdered(_q_value, valueToAdd); }
94
95 T fetchAndSubRelaxed(T valueToAdd) noexcept
96 { return Ops::fetchAndSubRelaxed(_q_value, valueToAdd); }
97 T fetchAndSubAcquire(T valueToAdd) noexcept
98 { return Ops::fetchAndSubAcquire(_q_value, valueToAdd); }
99 T fetchAndSubRelease(T valueToAdd) noexcept
100 { return Ops::fetchAndSubRelease(_q_value, valueToAdd); }
101 T fetchAndSubOrdered(T valueToAdd) noexcept
102 { return Ops::fetchAndSubOrdered(_q_value, valueToAdd); }
103
104 T fetchAndAndRelaxed(T valueToAdd) noexcept
105 { return Ops::fetchAndAndRelaxed(_q_value, valueToAdd); }
106 T fetchAndAndAcquire(T valueToAdd) noexcept
107 { return Ops::fetchAndAndAcquire(_q_value, valueToAdd); }
108 T fetchAndAndRelease(T valueToAdd) noexcept
109 { return Ops::fetchAndAndRelease(_q_value, valueToAdd); }
110 T fetchAndAndOrdered(T valueToAdd) noexcept
111 { return Ops::fetchAndAndOrdered(_q_value, valueToAdd); }
112
113 T fetchAndOrRelaxed(T valueToAdd) noexcept
114 { return Ops::fetchAndOrRelaxed(_q_value, valueToAdd); }
115 T fetchAndOrAcquire(T valueToAdd) noexcept
116 { return Ops::fetchAndOrAcquire(_q_value, valueToAdd); }
117 T fetchAndOrRelease(T valueToAdd) noexcept
118 { return Ops::fetchAndOrRelease(_q_value, valueToAdd); }
119 T fetchAndOrOrdered(T valueToAdd) noexcept
120 { return Ops::fetchAndOrOrdered(_q_value, valueToAdd); }
121
122 T fetchAndXorRelaxed(T valueToAdd) noexcept
123 { return Ops::fetchAndXorRelaxed(_q_value, valueToAdd); }
124 T fetchAndXorAcquire(T valueToAdd) noexcept
125 { return Ops::fetchAndXorAcquire(_q_value, valueToAdd); }
126 T fetchAndXorRelease(T valueToAdd) noexcept
127 { return Ops::fetchAndXorRelease(_q_value, valueToAdd); }
128 T fetchAndXorOrdered(T valueToAdd) noexcept
129 { return Ops::fetchAndXorOrdered(_q_value, valueToAdd); }
130
131 T operator++() noexcept
132 { return fetchAndAddOrdered(1) + 1; }
133 T operator++(int) noexcept
134 { return fetchAndAddOrdered(1); }
135 T operator--() noexcept
136 { return fetchAndSubOrdered(1) - 1; }
137 T operator--(int) noexcept
138 { return fetchAndSubOrdered(1); }
139
140 T operator+=(T v) noexcept
141 { return fetchAndAddOrdered(v) + v; }
142 T operator-=(T v) noexcept
143 { return fetchAndSubOrdered(v) - v; }
144 T operator&=(T v) noexcept
145 { return fetchAndAndOrdered(v) & v; }
146 T operator|=(T v) noexcept
147 { return fetchAndOrOrdered(v) | v; }
148 T operator^=(T v) noexcept
149 { return fetchAndXorOrdered(v) ^ v; }
150
151
152 QBasicAtomicInteger() = default;
153 constexpr QBasicAtomicInteger(T value) noexcept : _q_value(value) {}
154 QBasicAtomicInteger(const QBasicAtomicInteger &) = delete;
155 QBasicAtomicInteger &operator=(const QBasicAtomicInteger &) = delete;
156 QBasicAtomicInteger &operator=(const QBasicAtomicInteger &) volatile = delete;
157};
159
160template <typename X>
162{
163public:
164 typedef X *Type;
166 typedef typename Ops::Type AtomicType;
167
169
170 Type loadRelaxed() const noexcept { return Ops::loadRelaxed(_q_value); }
171 void storeRelaxed(Type newValue) noexcept { Ops::storeRelaxed(_q_value, newValue); }
172
173 operator Type() const noexcept { return loadAcquire(); }
174 Type operator=(Type newValue) noexcept { storeRelease(newValue); return newValue; }
175
176 // Atomic API, implemented in qatomic_XXX.h
177 Type loadAcquire() const noexcept { return Ops::loadAcquire(_q_value); }
178 void storeRelease(Type newValue) noexcept { Ops::storeRelease(_q_value, newValue); }
179
180 static constexpr bool isTestAndSetNative() noexcept { return Ops::isTestAndSetNative(); }
181 static constexpr bool isTestAndSetWaitFree() noexcept { return Ops::isTestAndSetWaitFree(); }
182
183 bool testAndSetRelaxed(Type expectedValue, Type newValue) noexcept
184 { return Ops::testAndSetRelaxed(_q_value, expectedValue, newValue); }
185 bool testAndSetAcquire(Type expectedValue, Type newValue) noexcept
186 { return Ops::testAndSetAcquire(_q_value, expectedValue, newValue); }
187 bool testAndSetRelease(Type expectedValue, Type newValue) noexcept
188 { return Ops::testAndSetRelease(_q_value, expectedValue, newValue); }
189 bool testAndSetOrdered(Type expectedValue, Type newValue) noexcept
190 { return Ops::testAndSetOrdered(_q_value, expectedValue, newValue); }
191
192 bool testAndSetRelaxed(Type expectedValue, Type newValue, Type &currentValue) noexcept
193 { return Ops::testAndSetRelaxed(_q_value, expectedValue, newValue, &currentValue); }
194 bool testAndSetAcquire(Type expectedValue, Type newValue, Type &currentValue) noexcept
195 { return Ops::testAndSetAcquire(_q_value, expectedValue, newValue, &currentValue); }
196 bool testAndSetRelease(Type expectedValue, Type newValue, Type &currentValue) noexcept
197 { return Ops::testAndSetRelease(_q_value, expectedValue, newValue, &currentValue); }
198 bool testAndSetOrdered(Type expectedValue, Type newValue, Type &currentValue) noexcept
199 { return Ops::testAndSetOrdered(_q_value, expectedValue, newValue, &currentValue); }
200
201 static constexpr bool isFetchAndStoreNative() noexcept { return Ops::isFetchAndStoreNative(); }
202 static constexpr bool isFetchAndStoreWaitFree() noexcept { return Ops::isFetchAndStoreWaitFree(); }
203
204 Type fetchAndStoreRelaxed(Type newValue) noexcept
205 { return Ops::fetchAndStoreRelaxed(_q_value, newValue); }
206 Type fetchAndStoreAcquire(Type newValue) noexcept
207 { return Ops::fetchAndStoreAcquire(_q_value, newValue); }
208 Type fetchAndStoreRelease(Type newValue) noexcept
209 { return Ops::fetchAndStoreRelease(_q_value, newValue); }
210 Type fetchAndStoreOrdered(Type newValue) noexcept
211 { return Ops::fetchAndStoreOrdered(_q_value, newValue); }
212
213 static constexpr bool isFetchAndAddNative() noexcept { return Ops::isFetchAndAddNative(); }
214 static constexpr bool isFetchAndAddWaitFree() noexcept { return Ops::isFetchAndAddWaitFree(); }
215
216 Type fetchAndAddRelaxed(qptrdiff valueToAdd) noexcept
217 { return Ops::fetchAndAddRelaxed(_q_value, valueToAdd); }
218 Type fetchAndAddAcquire(qptrdiff valueToAdd) noexcept
219 { return Ops::fetchAndAddAcquire(_q_value, valueToAdd); }
220 Type fetchAndAddRelease(qptrdiff valueToAdd) noexcept
221 { return Ops::fetchAndAddRelease(_q_value, valueToAdd); }
222 Type fetchAndAddOrdered(qptrdiff valueToAdd) noexcept
223 { return Ops::fetchAndAddOrdered(_q_value, valueToAdd); }
224
225 Type fetchAndSubRelaxed(qptrdiff valueToAdd) noexcept
226 { return Ops::fetchAndSubRelaxed(_q_value, valueToAdd); }
227 Type fetchAndSubAcquire(qptrdiff valueToAdd) noexcept
228 { return Ops::fetchAndSubAcquire(_q_value, valueToAdd); }
229 Type fetchAndSubRelease(qptrdiff valueToAdd) noexcept
230 { return Ops::fetchAndSubRelease(_q_value, valueToAdd); }
231 Type fetchAndSubOrdered(qptrdiff valueToAdd) noexcept
232 { return Ops::fetchAndSubOrdered(_q_value, valueToAdd); }
233
234 Type operator++() noexcept
235 { return fetchAndAddOrdered(1) + 1; }
236 Type operator++(int) noexcept
237 { return fetchAndAddOrdered(1); }
238 Type operator--() noexcept
239 { return fetchAndSubOrdered(1) - 1; }
240 Type operator--(int) noexcept
241 { return fetchAndSubOrdered(1); }
242 Type operator+=(qptrdiff valueToAdd) noexcept
243 { return fetchAndAddOrdered(valueToAdd) + valueToAdd; }
244 Type operator-=(qptrdiff valueToSub) noexcept
245 { return fetchAndSubOrdered(valueToSub) - valueToSub; }
246
248 constexpr QBasicAtomicPointer(Type value) noexcept : _q_value(value) {}
252};
253
254#ifndef Q_BASIC_ATOMIC_INITIALIZER
255# define Q_BASIC_ATOMIC_INITIALIZER(a) { (a) }
256#endif
257
258QT_END_NAMESPACE
259
260QT_WARNING_POP
261
262#endif // QBASICATOMIC_H
bool testAndSetOrdered(Type expectedValue, Type newValue, Type &currentValue) noexcept
QBasicAtomicPointer & operator=(const QBasicAtomicPointer &)=delete
Type fetchAndAddOrdered(qptrdiff valueToAdd) noexcept
bool testAndSetRelaxed(Type expectedValue, Type newValue) noexcept
Type fetchAndStoreAcquire(Type newValue) noexcept
Type fetchAndStoreRelease(Type newValue) noexcept
Type operator-=(qptrdiff valueToSub) noexcept
static constexpr bool isFetchAndAddNative() noexcept
bool testAndSetRelease(Type expectedValue, Type newValue) noexcept
Type fetchAndStoreOrdered(Type newValue) noexcept
QBasicAtomicPointer()=default
Type operator=(Type newValue) noexcept
constexpr QBasicAtomicPointer(Type value) noexcept
bool testAndSetAcquire(Type expectedValue, Type newValue) noexcept
bool testAndSetRelease(Type expectedValue, Type newValue, Type &currentValue) noexcept
Type operator++(int) noexcept
QBasicAtomicPointer(const QBasicAtomicPointer &)=delete
Type loadAcquire() const noexcept
Type operator--(int) noexcept
bool testAndSetAcquire(Type expectedValue, Type newValue, Type &currentValue) noexcept
Type fetchAndSubRelaxed(qptrdiff valueToAdd) noexcept
static constexpr bool isFetchAndAddWaitFree() noexcept
bool testAndSetOrdered(Type expectedValue, Type newValue) noexcept
static constexpr bool isTestAndSetNative() noexcept
Type operator+=(qptrdiff valueToAdd) noexcept
Type fetchAndSubOrdered(qptrdiff valueToAdd) noexcept
Type loadRelaxed() const noexcept
Type operator++() noexcept
static constexpr bool isFetchAndStoreWaitFree() noexcept
Type fetchAndSubRelease(qptrdiff valueToAdd) noexcept
QBasicAtomicPointer & operator=(const QBasicAtomicPointer &) volatile =delete
void storeRelaxed(Type newValue) noexcept
bool testAndSetRelaxed(Type expectedValue, Type newValue, Type &currentValue) noexcept
Type fetchAndAddRelaxed(qptrdiff valueToAdd) noexcept
void storeRelease(Type newValue) noexcept
operator Type() const noexcept
QAtomicOps< Type > Ops
Type fetchAndSubAcquire(qptrdiff valueToAdd) noexcept
Type fetchAndAddRelease(qptrdiff valueToAdd) noexcept
static constexpr bool isTestAndSetWaitFree() noexcept
Type fetchAndAddAcquire(qptrdiff valueToAdd) noexcept
Type operator--() noexcept
Type fetchAndStoreRelaxed(Type newValue) noexcept
static constexpr bool isFetchAndStoreNative() noexcept
QDeferredDeleteEvent(int loopLevel, int scopeLevel)
Constructs a deferred delete event with the given loop and scope level.
QBasicAtomicInteger< int > QBasicAtomicInt
static int registerEventTypeZeroBased(int id) noexcept
QBasicAtomicBitField< QEvent::MaxUser - QEvent::User+1 > UserEventTypeRegistry
QT_BEGIN_NAMESPACE Q_TRACE_POINT(qtcore, QEvent_ctor, QEvent *event, QEvent::Type type)
#define Q_IMPL_EVENT_COMMON(Class)
Definition qcoreevent.h:32