Nebula
Loading...
Searching...
No Matches
interlocked.h
Go to the documentation of this file.
1#pragma once
2//------------------------------------------------------------------------------
12//------------------------------------------------------------------------------
13#include "core/types.h"
14#include "core/config.h"
15#include <new>
16namespace Threading
17{
18
19using int64 = int64_t;
20
21namespace Interlocked
22{
23using int64 = int64_t;
24
26int Add(int volatile* var, int add);
28int64 Add(int64 volatile* var, int64 add);
30int Or(int volatile* var, int value);
32int64 Or(int64 volatile* var, int64 value);
34int And(int volatile* var, int value);
36int64 And(int64 volatile* var, int64 value);
38int Xor(int volatile* var, int value);
40int64 Xor(int64 volatile* var, int64 value);
42int Exchange(int volatile* dest, int value);
44int64 Exchange(int64 volatile* dest, int64 value);
46int CompareExchange(int volatile* dest, int exchange, int comparand);
48int64 CompareExchange(int64 volatile* dest, int64 exchange, int64 comparand);
50void* ExchangePointer(void* volatile* dest, void* value);
52void* CompareExchangePointer(void* volatile* dest, void* exchange, void* comparand);
54int Increment(int volatile* var);
56int64 Increment(int64 volatile* var);
58int Decrement(int volatile* var);
60int64 Decrement(int64 volatile* var);
61
62struct alignas(std::hardware_destructive_interference_size) AtomicInt
63{
66 : value(0)
67 {}
68
70 AtomicInt(int initial)
71 : value(initial)
72 {}
73
75 void operator=(int value)
76 {
77 this->value = value;
78 }
79
81 int Add(int add)
82 {
83 return Threading::Interlocked::Add((volatile int*)&this->value, add);
84 }
85
86 int Sub(int sub)
87 {
88 return Threading::Interlocked::Add((volatile int*)&this->value, -sub);
89 }
90
91 int Or(int mask)
92 {
93 return Threading::Interlocked::Or((volatile int*)&this->value, mask);
94 }
95
96 int And(int mask)
97 {
98 return Threading::Interlocked::And((volatile int*)&this->value, mask);
99 }
100
102 {
103 return Threading::Interlocked::Exchange((volatile int*)&this->value, value);
104 }
105
106 int CompareExchange(int exchange, int comparand)
107 {
108 return Threading::Interlocked::CompareExchange((volatile int*)&this->value, exchange, comparand);
109 }
110
111 int Increment(int incr)
112 {
113 return Threading::Interlocked::Add((volatile int*)&this->value, incr);
114 }
115
116 int Decrement(int decr)
117 {
118 return Threading::Interlocked::Add((volatile int*)&this->value, -decr);
119 }
120
121 volatile int value;
122};
123
124struct alignas(std::hardware_destructive_interference_size) AtomicInt64
125{
128 : value(0)
129 {}
130
133 : value(initial)
134 {}
135
138 {
139 this->value = value;
140 }
141
144 {
145 return Threading::Interlocked::Add((volatile int64*)&this->value, add);
146 }
147
149 {
150 return Threading::Interlocked::Add((volatile int64*)&this->value, -sub);
151 }
152
154 {
155 return Threading::Interlocked::Or((volatile int64*)&this->value, mask);
156 }
157
159 {
160 return Threading::Interlocked::And((volatile int64*)&this->value, mask);
161 }
162
164 {
165 return Threading::Interlocked::Exchange((volatile int64*)&this->value, value);
166 }
167
168 int64 CompareExchange(int64 exchange, int64 comparand)
169 {
170 return Threading::Interlocked::CompareExchange((volatile int64*)&this->value, exchange, comparand);
171 }
172
174 {
175 return Threading::Interlocked::Add((volatile int64*)&this->value, incr);
176 }
177
179 {
180 return Threading::Interlocked::Add((volatile int64*)&this->value, -decr);
181 }
182
183 volatile int64 value;
184};
185
186struct alignas(std::hardware_destructive_interference_size) AtomicPointer
187{
189 AtomicPointer(void* initial)
190 : ptr(initial)
191 {}
192
194 void operator=(void* value)
195 {
196 this->ptr = value;
197
198 }
199
200 void* Exchange(void* value)
201 {
202 return Threading::Interlocked::ExchangePointer((void* volatile*)&this->ptr, value);
203 }
204
205 void* CompareExchange(void* exchange, void* comparand)
206 {
207 return Threading::Interlocked::CompareExchangePointer((void* volatile*)&this->ptr, exchange, comparand);
208 }
209 volatile void* ptr;
210};
211
213struct alignas(std::hardware_destructive_interference_size) AtomicCounter
214{
215 volatile int counter;
216
218 : counter(0)
219 {}
220
222 AtomicCounter(int initial)
223 : counter(initial)
224 {}
225
227 bool operator==(int value) const
228 {
229 return this->counter == value;
230 }
231
233 bool operator!=(int value) const
234 {
235 return this->counter != value;
236 }
237
239 bool operator>(int value) const
240 {
241 return this->counter > value;
242 }
243
245 bool operator>=(int value) const
246 {
247 return this->counter >= value;
248 }
249
251 bool operator<(int value) const
252 {
253 return this->counter < value;
254 }
255
257 bool operator<=(int value) const
258 {
259 return this->counter <= value;
260 }
261
264 {
265 return Threading::Interlocked::Increment(&this->counter);
266 }
267
270 {
271 return Threading::Interlocked::Decrement(&this->counter);
272 }
273
275 int Add(int addend)
276 {
277 return Threading::Interlocked::Add(&this->counter, addend);
278 }
279
281 int Subtract(int subtractor)
282 {
283 return Threading::Interlocked::Add(&this->counter, -subtractor);
284 }
285
287 int Exchange(int value)
288 {
289 return Threading::Interlocked::Exchange(&this->counter, value);
290 }
291
294 {
295 this->counter--;
296 }
297
300 {
301 this->counter++;
302 }
303
305 void RaceExchange(int value)
306 {
307 this->counter = value;
308 }
309};
310
312struct alignas(std::hardware_destructive_interference_size) AtomicCounter64
313{
314 volatile int64 counter;
315
317 : counter(0)
318 {}
319
322 : counter(initial)
323 {}
324
326 bool operator==(int64 value) const
327 {
328 return this->counter == value;
329 }
330
332 bool operator!=(int64 value) const
333 {
334 return this->counter != value;
335 }
336
338 bool operator>(int64 value) const
339 {
340 return this->counter > value;
341 }
342
344 bool operator>=(int64 value) const
345 {
346 return this->counter >= value;
347 }
348
350 bool operator<(int64 value) const
351 {
352 return this->counter < value;
353 }
354
356 bool operator<=(int64 value) const
357 {
358 return this->counter <= value;
359 }
360
363 {
364 return Threading::Interlocked::Increment(&this->counter);
365 }
366
369 {
370 return Threading::Interlocked::Decrement(&this->counter);
371 }
372
375 {
376 return Threading::Interlocked::Add(&this->counter, addend);
377 }
378
380 int64 Subtract(int64 subtractor)
381 {
382 return Threading::Interlocked::Add(&this->counter, -subtractor);
383 }
384
387 {
388 return Threading::Interlocked::Exchange(&this->counter, value);
389 }
390
393 {
394 this->counter--;
395 }
396
399 {
400 this->counter++;
401 }
402
404 void RaceExchange(int64 value)
405 {
406 this->counter = value;
407 }
408};
409
410
411} // namespace Interlocked
412} // namespace Threading
int64_t int64
Definition interlocked.h:23
Nebula compiler specific defines and configuration.
Definition gccinterlocked.cc:16
int Decrement(int volatile *var)
interlocked decrement, return result
Definition gccinterlocked.cc:157
int And(int volatile *var, int add)
interlocked and
Definition gccinterlocked.cc:58
int Or(int volatile *var, int add)
interlocked or
Definition gccinterlocked.cc:40
void * ExchangePointer(void *volatile *dest, void *value)
interlocked exchange
Definition gccinterlocked.cc:130
int Add(int volatile *var, int add)
interlocked add
Definition gccinterlocked.cc:22
int Exchange(int volatile *dest, int value)
interlocked exchange
Definition gccinterlocked.cc:94
int Xor(int volatile *var, int add)
interlocked xor
Definition gccinterlocked.cc:76
int CompareExchange(int volatile *dest, int exchange, int comparand)
interlocked compare-exchange
Definition gccinterlocked.cc:112
int Increment(int volatile *var)
interlocked increment, return result
Definition gccinterlocked.cc:148
void * CompareExchangePointer(void *volatile *dest, void *exchange, void *comparand)
interlocked compare-exchange pointer
Definition gccinterlocked.cc:139
The Jobs2 system provides a set of threads and a pool of jobs from which threads can pickup work.
Definition jobs2.h:16
int64_t int64
Definition interlocked.h:19
int64 Subtract(int64 subtractor)
Subtract and return the old value.
Definition interlocked.h:380
int64 Add(int64 addend)
Add and return the old value.
Definition interlocked.h:374
bool operator>(int64 value) const
Greater.
Definition interlocked.h:338
void RaceIncrement()
Unsafe increment, only use before or after contention is possible.
Definition interlocked.h:398
AtomicCounter64(int64 initial)
Constructor.
Definition interlocked.h:321
bool operator>=(int64 value) const
Greater or equal.
Definition interlocked.h:344
bool operator!=(int64 value) const
Not-equals.
Definition interlocked.h:332
AtomicCounter64()
Definition interlocked.h:316
void RaceExchange(int64 value)
Unsafe exchange, only use before or after contention is possible.
Definition interlocked.h:404
bool operator==(int64 value) const
Equals.
Definition interlocked.h:326
int64 Exchange(int64 value)
Exchange and return the old value.
Definition interlocked.h:386
int Increment()
Increment and return the new value.
Definition interlocked.h:362
bool operator<(int64 value) const
Less.
Definition interlocked.h:350
int Decrement()
Decrement and return the new value.
Definition interlocked.h:368
bool operator<=(int64 value) const
Less or equal.
Definition interlocked.h:356
void RaceDecrement()
Unsafe decrement, only use before or after contention is possible.
Definition interlocked.h:392
volatile int64 counter
Definition interlocked.h:314
void RaceDecrement()
Unsafe decrement, only use before or after contention is possible.
Definition interlocked.h:293
bool operator>(int value) const
Greater.
Definition interlocked.h:239
bool operator>=(int value) const
Greater or equal.
Definition interlocked.h:245
bool operator!=(int value) const
Not-equals.
Definition interlocked.h:233
int Add(int addend)
Add and return the old value.
Definition interlocked.h:275
int Exchange(int value)
Exchange and return the old value.
Definition interlocked.h:287
void RaceIncrement()
Unsafe increment, only use before or after contention is possible.
Definition interlocked.h:299
int Decrement()
Decrement and return the new value.
Definition interlocked.h:269
AtomicCounter(int initial)
Constructor.
Definition interlocked.h:222
int Increment()
Increment and return the new value.
Definition interlocked.h:263
void RaceExchange(int value)
Unsafe exchange, only use before or after contention is possible.
Definition interlocked.h:305
AtomicCounter()
Definition interlocked.h:217
bool operator<(int value) const
Less.
Definition interlocked.h:251
int Subtract(int subtractor)
Subtract and return the old value.
Definition interlocked.h:281
volatile int counter
Definition interlocked.h:215
bool operator<=(int value) const
Less or equal.
Definition interlocked.h:257
bool operator==(int value) const
Equals.
Definition interlocked.h:227
int64 And(int64 mask)
And.
Definition interlocked.h:158
int64 Increment(int64 incr)
Increment and return new value.
Definition interlocked.h:173
AtomicInt64(int64 initial)
Constructor.
Definition interlocked.h:132
int64 Add(int64 add)
Add.
Definition interlocked.h:143
void operator=(int64 value)
Assignment (unsafe).
Definition interlocked.h:137
AtomicInt64()
Constructor.
Definition interlocked.h:127
int64 CompareExchange(int64 exchange, int64 comparand)
Compare and exchange.
Definition interlocked.h:168
int64 Sub(int64 sub)
Subtract.
Definition interlocked.h:148
volatile int64 value
Definition interlocked.h:183
int64 Decrement(int64 decr)
Decrement and return new value.
Definition interlocked.h:178
int64 Or(int64 mask)
Or.
Definition interlocked.h:153
int64 Exchange(int64 value)
Exchange.
Definition interlocked.h:163
volatile int value
Definition interlocked.h:121
int Increment(int incr)
Increment and return new value.
Definition interlocked.h:111
int Exchange(int value)
Exchange.
Definition interlocked.h:101
int Or(int mask)
Or.
Definition interlocked.h:91
int Decrement(int decr)
Decrement and return new value.
Definition interlocked.h:116
AtomicInt()
Constructor.
Definition interlocked.h:65
int CompareExchange(int exchange, int comparand)
Compare and exchange.
Definition interlocked.h:106
int Sub(int sub)
Subtract.
Definition interlocked.h:86
void operator=(int value)
Assignment (unsafe).
Definition interlocked.h:75
int And(int mask)
And.
Definition interlocked.h:96
AtomicInt(int initial)
Constructor.
Definition interlocked.h:70
int Add(int add)
Add.
Definition interlocked.h:81
void operator=(void *value)
Assignment (unsafe).
Definition interlocked.h:194
AtomicPointer(void *initial)
Constructor.
Definition interlocked.h:189
volatile void * ptr
Definition interlocked.h:209
void * CompareExchange(void *exchange, void *comparand)
Compare and exchange.
Definition interlocked.h:205
void * Exchange(void *value)
Exchange.
Definition interlocked.h:200