kernel
Loading...
Searching...
No Matches
atomic.h
Go to the documentation of this file.
1/* atomic.h
2 * Fully featured interlocked/atomic helpers for MatanelOS kernel.
3 *
4 * - Uses GCC/Clang __atomic builtins (x86_64).
5 * - Default memory ordering: sequentially consistent (__ATOMIC_SEQ_CST).
6 * - Naming follows Windows-style "Interlocked" but includes unsigned variants.
7 *
8 * Semantics summary:
9 * - Exchange functions return the previous value.
10 * - CompareExchange returns the initial value that was at target (Windows style).
11 * - Add/Increment/Decrement return the **new** value (matching InterlockedAdd semantics).
12 * - And/Or return the **previous** value (matching Windows InterlockedAnd/Or).
13 *
14 * Note: The CPU treats bit patterns the same for signed/unsigned. Use unsigned forms
15 * for bitmasks/flags to avoid sign confusion in caller code.
16 */
17
18#ifndef X86_ATOMIC_H
19#define X86_ATOMIC_H
20
21#include <stdint.h>
22#include <stddef.h>
23#include <stdbool.h>
24#include <stdatomic.h>
26
27#ifdef __cplusplus
28extern "C" {
29#endif
30
31#define ATOMIC_ORDER __ATOMIC_SEQ_CST
32
33 /* Exchange (returns previous value) */
34 FORCEINLINE int8_t InterlockedExchange8(volatile int8_t* target, int8_t value) { return __atomic_exchange_n(target, value, ATOMIC_ORDER); }
35 FORCEINLINE int16_t InterlockedExchange16(volatile int16_t* target, int16_t value) { return __atomic_exchange_n(target, value, ATOMIC_ORDER); }
36 FORCEINLINE int32_t InterlockedExchange32(volatile int32_t* target, int32_t value) { return __atomic_exchange_n(target, value, ATOMIC_ORDER); }
37 FORCEINLINE int64_t InterlockedExchange64(volatile int64_t* target, int64_t value) { return __atomic_exchange_n(target, value, ATOMIC_ORDER); }
38
39 FORCEINLINE uint8_t InterlockedExchangeU8(volatile uint8_t* target, uint8_t value) { return __atomic_exchange_n(target, value, ATOMIC_ORDER); }
40 FORCEINLINE uint16_t InterlockedExchangeU16(volatile uint16_t* target, uint16_t value) { return __atomic_exchange_n(target, value, ATOMIC_ORDER); }
41 FORCEINLINE uint32_t InterlockedExchangeU32(volatile uint32_t* target, uint32_t value) { return __atomic_exchange_n(target, value, ATOMIC_ORDER); }
42 FORCEINLINE uint64_t InterlockedExchangeU64(volatile uint64_t* target, uint64_t value) { return __atomic_exchange_n(target, value, ATOMIC_ORDER); }
43
44 /* Pointer exchange */
45 FORCEINLINE void* InterlockedExchangePtr(volatile void* volatile* target, void* value) {
46 return __atomic_exchange_n((void* volatile*)target, value, __ATOMIC_ACQUIRE);
47 }
48
49 /* CompareExchange (returns initial value that was at target) */
50 FORCEINLINE int8_t InterlockedCompareExchange8(volatile int8_t* target, int8_t value, int8_t comparand) {
51 int8_t expected = comparand;
52 __atomic_compare_exchange_n(target, &expected, value, 0, ATOMIC_ORDER, ATOMIC_ORDER);
53 return expected;
54 }
55 FORCEINLINE int16_t InterlockedCompareExchange16(volatile int16_t* target, int16_t value, int16_t comparand) {
56 int16_t expected = comparand;
57 __atomic_compare_exchange_n(target, &expected, value, 0, ATOMIC_ORDER, ATOMIC_ORDER);
58 return expected;
59 }
60 FORCEINLINE int32_t InterlockedCompareExchange32(volatile int32_t* target, int32_t value, int32_t comparand) {
61 int32_t expected = comparand;
62 __atomic_compare_exchange_n(target, &expected, value, 0, ATOMIC_ORDER, ATOMIC_ORDER);
63 return expected;
64 }
65 FORCEINLINE int64_t InterlockedCompareExchange64(volatile int64_t* target, int64_t value, int64_t comparand) {
66 int64_t expected = comparand;
67 __atomic_compare_exchange_n(target, &expected, value, 0, ATOMIC_ORDER, ATOMIC_ORDER);
68 return expected;
69 }
70
71 FORCEINLINE uint8_t InterlockedCompareExchangeU8(volatile uint8_t* target, uint8_t value, uint8_t comparand) {
72 uint8_t expected = comparand;
73 __atomic_compare_exchange_n(target, &expected, value, 0, ATOMIC_ORDER, ATOMIC_ORDER);
74 return expected;
75 }
76 FORCEINLINE uint16_t InterlockedCompareExchangeU16(volatile uint16_t* target, uint16_t value, uint16_t comparand) {
77 uint16_t expected = comparand;
78 __atomic_compare_exchange_n(target, &expected, value, 0, ATOMIC_ORDER, ATOMIC_ORDER);
79 return expected;
80 }
81 FORCEINLINE uint32_t InterlockedCompareExchangeU32(volatile uint32_t* target, uint32_t value, uint32_t comparand) {
82 uint32_t expected = comparand;
83 __atomic_compare_exchange_n(target, &expected, value, 0, ATOMIC_ORDER, ATOMIC_ORDER);
84 return expected;
85 }
86 FORCEINLINE uint64_t InterlockedCompareExchangeU64(volatile uint64_t* target, uint64_t value, uint64_t comparand) {
87 uint64_t expected = comparand;
88 __atomic_compare_exchange_n(target, &expected, value, 0, ATOMIC_ORDER, ATOMIC_ORDER);
89 return expected;
90 }
91
92 FORCEINLINE bool InterlockedCompareExchangeU64_bool(volatile uint64_t* target, uint64_t value, uint64_t* expected) {
93 // returns true on success, and updates *expected with current value on failure
94 return __atomic_compare_exchange_n(target, expected, value, 0,
95 __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
96 }
97
98 /* Pointer CompareExchange */
99 FORCEINLINE void* InterlockedCompareExchangePtr(volatile void* volatile* target, void* value, void* comparand) {
100 void* expected = comparand;
101 __atomic_compare_exchange_n((void* volatile*)target, &expected, value, 0, ATOMIC_ORDER, ATOMIC_ORDER);
102 return expected;
103 }
104
105 /* -------------------------------
106 Add / Inc / Dec (return NEW value)
107 ------------------------------- */
108 FORCEINLINE int8_t InterlockedAdd8(volatile int8_t* target, int8_t value) { return __atomic_add_fetch(target, value, ATOMIC_ORDER); }
109 FORCEINLINE int16_t InterlockedAdd16(volatile int16_t* target, int16_t value) { return __atomic_add_fetch(target, value, ATOMIC_ORDER); }
110 FORCEINLINE int32_t InterlockedAdd32(volatile int32_t* target, int32_t value) { return __atomic_add_fetch(target, value, ATOMIC_ORDER); }
111 FORCEINLINE int64_t InterlockedAdd64(volatile int64_t* target, int64_t value) { return __atomic_add_fetch(target, value, ATOMIC_ORDER); }
112
113 FORCEINLINE uint8_t InterlockedAddU8(volatile uint8_t* target, uint8_t value) { return __atomic_add_fetch(target, value, ATOMIC_ORDER); }
114 FORCEINLINE uint16_t InterlockedAddU16(volatile uint16_t* target, uint16_t value) { return __atomic_add_fetch(target, value, ATOMIC_ORDER); }
115 FORCEINLINE uint32_t InterlockedAddU32(volatile uint32_t* target, uint32_t value) { return __atomic_add_fetch(target, value, ATOMIC_ORDER); }
116 FORCEINLINE uint64_t InterlockedAddU64(volatile uint64_t* target, uint64_t value) { return __atomic_add_fetch(target, value, ATOMIC_ORDER); }
117
118 /* Increment / Decrement convenience (return NEW value) */
119 FORCEINLINE int32_t InterlockedIncrement32(volatile int32_t* target) { return InterlockedAdd32(target, 1); }
120 FORCEINLINE int32_t InterlockedDecrement32(volatile int32_t* target) { return InterlockedAdd32(target, -1); }
121 FORCEINLINE uint32_t InterlockedIncrementU32(volatile uint32_t* target) { return InterlockedAddU32(target, 1); }
122 FORCEINLINE uint32_t InterlockedDecrementU32(volatile uint32_t* target) { return InterlockedAddU32(target, (uint32_t)-1); }
123
124 FORCEINLINE int64_t InterlockedIncrement64(volatile int64_t* target) { return InterlockedAdd64(target, 1); }
125 FORCEINLINE uint64_t InterlockedIncrementU64(volatile uint64_t* target) { return InterlockedAddU64(target, 1); }
126
127 FORCEINLINE int64_t InterlockedDecrement64(volatile int64_t* target) { return InterlockedAdd64(target, -1); }
128 FORCEINLINE uint64_t InterlockedDecrementU64(volatile uint64_t* target) { return InterlockedAddU64(target, (uint64_t)-1); }
129 /* -------------------------------
130 Bitwise AND / OR (return PREVIOUS value)
131 ------------------------------- */
132 FORCEINLINE int8_t InterlockedAnd8(volatile int8_t* target, int8_t value) { return __atomic_fetch_and(target, value, ATOMIC_ORDER); }
133 FORCEINLINE int16_t InterlockedAnd16(volatile int16_t* target, int16_t value) { return __atomic_fetch_and(target, value, ATOMIC_ORDER); }
134 FORCEINLINE int32_t InterlockedAnd32(volatile int32_t* target, int32_t value) { return __atomic_fetch_and(target, value, ATOMIC_ORDER); }
135 FORCEINLINE int64_t InterlockedAnd64(volatile int64_t* target, int64_t value) { return __atomic_fetch_and(target, value, ATOMIC_ORDER); }
136
137 FORCEINLINE uint8_t InterlockedAndU8(volatile uint8_t* target, uint8_t value) { return __atomic_fetch_and(target, value, ATOMIC_ORDER); }
138 FORCEINLINE uint16_t InterlockedAndU16(volatile uint16_t* target, uint16_t value) { return __atomic_fetch_and(target, value, ATOMIC_ORDER); }
139 FORCEINLINE uint32_t InterlockedAndU32(volatile uint32_t* target, uint32_t value) { return __atomic_fetch_and(target, value, ATOMIC_ORDER); }
140 FORCEINLINE uint64_t InterlockedAndU64(volatile uint64_t* target, uint64_t value) { return __atomic_fetch_and(target, value, ATOMIC_ORDER); }
141
142 FORCEINLINE int8_t InterlockedOr8(volatile int8_t* target, int8_t value) { return __atomic_fetch_or(target, value, ATOMIC_ORDER); }
143 FORCEINLINE int16_t InterlockedOr16(volatile int16_t* target, int16_t value) { return __atomic_fetch_or(target, value, ATOMIC_ORDER); }
144 FORCEINLINE int32_t InterlockedOr32(volatile int32_t* target, int32_t value) { return __atomic_fetch_or(target, value, ATOMIC_ORDER); }
145 FORCEINLINE int64_t InterlockedOr64(volatile int64_t* target, int64_t value) { return __atomic_fetch_or(target, value, ATOMIC_ORDER); }
146
147 FORCEINLINE uint8_t InterlockedOrU8(volatile uint8_t* target, uint8_t value) { return __atomic_fetch_or(target, value, ATOMIC_ORDER); }
148 FORCEINLINE uint16_t InterlockedOrU16(volatile uint16_t* target, uint16_t value) { return __atomic_fetch_or(target, value, ATOMIC_ORDER); }
149 FORCEINLINE uint32_t InterlockedOrU32(volatile uint32_t* target, uint32_t value) { return __atomic_fetch_or(target, value, ATOMIC_ORDER); }
150 FORCEINLINE uint64_t InterlockedOrU64(volatile uint64_t* target, uint64_t value) { return __atomic_fetch_or(target, value, ATOMIC_ORDER); }
151
152 /* -------------------------------
153 Pointer / uintptr helpers
154 ------------------------------- */
155 FORCEINLINE uintptr_t InterlockedExchangeUintptr(volatile uintptr_t* target, uintptr_t value) {
156 return __atomic_exchange_n(target, value, ATOMIC_ORDER);
157 }
158 FORCEINLINE uintptr_t InterlockedCompareExchangeUintptr(volatile uintptr_t* target, uintptr_t value, uintptr_t comparand) {
159 uintptr_t expected = comparand;
160 __atomic_compare_exchange_n(target, &expected, value, 0, ATOMIC_ORDER, ATOMIC_ORDER);
161 return expected;
162 }
163 FORCEINLINE uintptr_t InterlockedFetchAndUintptr(volatile uintptr_t* target, uintptr_t value) {
164 return __atomic_fetch_and(target, value, ATOMIC_ORDER);
165 }
166 FORCEINLINE uintptr_t InterlockedFetchOrUintptr(volatile uintptr_t* target, uintptr_t value) {
167 return __atomic_fetch_or(target, value, ATOMIC_ORDER);
168 }
169
170 // Boolean
171 FORCEINLINE bool InterlockedExchangeBool(volatile bool* target, bool value) {
172 return __atomic_exchange_n(target, value, __ATOMIC_SEQ_CST);
173 }
174
175 /* Pointer convenience wrappers */
176 FORCEINLINE void* InterlockedExchangePointer(volatile void* volatile* target, void* value) { return InterlockedExchangePtr(target, value); }
177 FORCEINLINE void* InterlockedCompareExchangePointer(volatile void* volatile* target, void* value, void* comparand) { return InterlockedCompareExchangePtr(target, value, comparand); }
178 FORCEINLINE void* InterlockedFetchPointer(volatile void* volatile* target) {
179 return __atomic_load_n((void* volatile*)target, ATOMIC_ORDER);
180 }
181
182 /* -------------------------------
183 Utility: test-and-set style helpers
184 ------------------------------- */
185
186 /* Atomically set bits in a uint32_t mask and return previous mask */
187 FORCEINLINE uint32_t InterlockedSetMaskU32(volatile uint32_t* target, uint32_t mask) {
188 return __atomic_fetch_or(target, mask, ATOMIC_ORDER);
189 }
190
191 /* Atomically clear bits and return previous mask */
192 FORCEINLINE uint32_t InterlockedClearMaskU32(volatile uint32_t* target, uint32_t mask) {
193 return __atomic_fetch_and(target, ~mask, ATOMIC_ORDER);
194 }
195
196 /* -------------------------------
197 Load / Store (atomic loads/stores with specified ordering)
198 ------------------------------- */
199 FORCEINLINE int32_t AtomicLoad32(volatile int32_t* target) {
200 return __atomic_load_n(target, ATOMIC_ORDER);
201 }
202 FORCEINLINE void AtomicStore32(volatile int32_t* target, int32_t v) {
203 __atomic_store_n(target, v, ATOMIC_ORDER);
204 }
205 FORCEINLINE uint32_t AtomicLoadU32(volatile uint32_t* target) {
206 return __atomic_load_n(target, ATOMIC_ORDER);
207 }
208 FORCEINLINE void AtomicStoreU32(volatile uint32_t* target, uint32_t v) {
209 __atomic_store_n(target, v, ATOMIC_ORDER);
210 }
211
212
213 FORCEINLINE int8_t InterlockedFetch8(volatile int8_t* target) { return __atomic_load_n(target, ATOMIC_ORDER); }
214 FORCEINLINE int16_t InterlockedFetch16(volatile int16_t* target) { return __atomic_load_n(target, ATOMIC_ORDER); }
215 FORCEINLINE int32_t InterlockedFetch32(volatile int32_t* target) { return __atomic_load_n(target, ATOMIC_ORDER); }
216 FORCEINLINE int64_t InterlockedFetch64(volatile int64_t* target) { return __atomic_load_n(target, ATOMIC_ORDER); }
217
218 FORCEINLINE uint8_t InterlockedFetchU8(volatile uint8_t* target) { return __atomic_load_n(target, ATOMIC_ORDER); }
219 FORCEINLINE uint16_t InterlockedFetchU16(volatile uint16_t* target) { return __atomic_load_n(target, ATOMIC_ORDER); }
220 FORCEINLINE uint32_t InterlockedFetchU32(volatile uint32_t* target) { return __atomic_load_n(target, ATOMIC_ORDER); }
221 FORCEINLINE uint64_t InterlockedFetchU64(volatile uint64_t* target) { return __atomic_load_n(target, ATOMIC_ORDER); }
222 /* -------------------------------
223 Notes:
224 - Types may be signed or unsigned; operations are bit-pattern operations.
225 - On x86_64 the builtins will generate LOCK-prefixed instructions where necessary.
226 - For 8/16-bit atomics be careful about alignment; prefer natural alignment for the type.
227 ------------------------------- */
228
229 FORCEINLINE bool InterlockedDecrementIfNotZero(volatile uint64_t* value)
230 {
231 uint64_t oldValue;
232 uint64_t newValue;
233
234 do {
235 oldValue = *value;
236
237 // If it's already 0, we can't decrement
238 if (oldValue == 0)
239 return false;
240
241 newValue = oldValue - 1;
242
243 // Attempt to swap oldValue -> newValue atomically
244 } while (InterlockedCompareExchangeU64((volatile uint64_t*)value, newValue, oldValue) != oldValue);
245
246 return true; // Successfully decremented
247 }
248
249#ifdef __cplusplus
250}
251#endif
252
253#endif /* MATANEL_ATOMIC_H */
#define FORCEINLINE
Definition annotations.h:23
FORCEINLINE int8_t InterlockedOr8(volatile int8_t *target, int8_t value)
Definition atomic.h:142
FORCEINLINE int64_t InterlockedCompareExchange64(volatile int64_t *target, int64_t value, int64_t comparand)
Definition atomic.h:65
FORCEINLINE uint8_t InterlockedAndU8(volatile uint8_t *target, uint8_t value)
Definition atomic.h:137
FORCEINLINE int64_t InterlockedAdd64(volatile int64_t *target, int64_t value)
Definition atomic.h:111
FORCEINLINE uint8_t InterlockedExchangeU8(volatile uint8_t *target, uint8_t value)
Definition atomic.h:39
FORCEINLINE int32_t InterlockedAnd32(volatile int32_t *target, int32_t value)
Definition atomic.h:134
FORCEINLINE int64_t InterlockedIncrement64(volatile int64_t *target)
Definition atomic.h:124
FORCEINLINE int64_t InterlockedOr64(volatile int64_t *target, int64_t value)
Definition atomic.h:145
FORCEINLINE uint8_t InterlockedFetchU8(volatile uint8_t *target)
Definition atomic.h:218
FORCEINLINE void AtomicStoreU32(volatile uint32_t *target, uint32_t v)
Definition atomic.h:208
FORCEINLINE uintptr_t InterlockedCompareExchangeUintptr(volatile uintptr_t *target, uintptr_t value, uintptr_t comparand)
Definition atomic.h:158
FORCEINLINE int64_t InterlockedFetch64(volatile int64_t *target)
Definition atomic.h:216
FORCEINLINE uint32_t InterlockedIncrementU32(volatile uint32_t *target)
Definition atomic.h:121
FORCEINLINE int16_t InterlockedFetch16(volatile int16_t *target)
Definition atomic.h:214
FORCEINLINE int32_t InterlockedDecrement32(volatile int32_t *target)
Definition atomic.h:120
FORCEINLINE uint64_t InterlockedAndU64(volatile uint64_t *target, uint64_t value)
Definition atomic.h:140
FORCEINLINE int32_t InterlockedOr32(volatile int32_t *target, int32_t value)
Definition atomic.h:144
FORCEINLINE int8_t InterlockedCompareExchange8(volatile int8_t *target, int8_t value, int8_t comparand)
Definition atomic.h:50
FORCEINLINE uint16_t InterlockedFetchU16(volatile uint16_t *target)
Definition atomic.h:219
FORCEINLINE int16_t InterlockedAnd16(volatile int16_t *target, int16_t value)
Definition atomic.h:133
FORCEINLINE uint64_t InterlockedCompareExchangeU64(volatile uint64_t *target, uint64_t value, uint64_t comparand)
Definition atomic.h:86
FORCEINLINE int32_t AtomicLoad32(volatile int32_t *target)
Definition atomic.h:199
FORCEINLINE uint8_t InterlockedOrU8(volatile uint8_t *target, uint8_t value)
Definition atomic.h:147
FORCEINLINE void * InterlockedExchangePtr(volatile void *volatile *target, void *value)
Definition atomic.h:45
FORCEINLINE uint64_t InterlockedIncrementU64(volatile uint64_t *target)
Definition atomic.h:125
FORCEINLINE int32_t InterlockedCompareExchange32(volatile int32_t *target, int32_t value, int32_t comparand)
Definition atomic.h:60
FORCEINLINE uint8_t InterlockedCompareExchangeU8(volatile uint8_t *target, uint8_t value, uint8_t comparand)
Definition atomic.h:71
FORCEINLINE uint16_t InterlockedAndU16(volatile uint16_t *target, uint16_t value)
Definition atomic.h:138
FORCEINLINE void AtomicStore32(volatile int32_t *target, int32_t v)
Definition atomic.h:202
FORCEINLINE int8_t InterlockedFetch8(volatile int8_t *target)
Definition atomic.h:213
FORCEINLINE int32_t InterlockedAdd32(volatile int32_t *target, int32_t value)
Definition atomic.h:110
FORCEINLINE uint32_t InterlockedAddU32(volatile uint32_t *target, uint32_t value)
Definition atomic.h:115
FORCEINLINE uint32_t InterlockedSetMaskU32(volatile uint32_t *target, uint32_t mask)
Definition atomic.h:187
FORCEINLINE void * InterlockedCompareExchangePointer(volatile void *volatile *target, void *value, void *comparand)
Definition atomic.h:177
FORCEINLINE uint16_t InterlockedExchangeU16(volatile uint16_t *target, uint16_t value)
Definition atomic.h:40
FORCEINLINE uint32_t InterlockedFetchU32(volatile uint32_t *target)
Definition atomic.h:220
FORCEINLINE int16_t InterlockedAdd16(volatile int16_t *target, int16_t value)
Definition atomic.h:109
FORCEINLINE uint16_t InterlockedOrU16(volatile uint16_t *target, uint16_t value)
Definition atomic.h:148
FORCEINLINE uint32_t InterlockedClearMaskU32(volatile uint32_t *target, uint32_t mask)
Definition atomic.h:192
FORCEINLINE uint32_t AtomicLoadU32(volatile uint32_t *target)
Definition atomic.h:205
FORCEINLINE uint64_t InterlockedFetchU64(volatile uint64_t *target)
Definition atomic.h:221
FORCEINLINE int32_t InterlockedIncrement32(volatile int32_t *target)
Definition atomic.h:119
FORCEINLINE uint64_t InterlockedExchangeU64(volatile uint64_t *target, uint64_t value)
Definition atomic.h:42
FORCEINLINE uint16_t InterlockedCompareExchangeU16(volatile uint16_t *target, uint16_t value, uint16_t comparand)
Definition atomic.h:76
FORCEINLINE int8_t InterlockedAdd8(volatile int8_t *target, int8_t value)
Definition atomic.h:108
FORCEINLINE void * InterlockedExchangePointer(volatile void *volatile *target, void *value)
Definition atomic.h:176
FORCEINLINE int64_t InterlockedDecrement64(volatile int64_t *target)
Definition atomic.h:127
FORCEINLINE uint32_t InterlockedDecrementU32(volatile uint32_t *target)
Definition atomic.h:122
FORCEINLINE uint64_t InterlockedDecrementU64(volatile uint64_t *target)
Definition atomic.h:128
FORCEINLINE int64_t InterlockedAnd64(volatile int64_t *target, int64_t value)
Definition atomic.h:135
#define ATOMIC_ORDER
Definition atomic.h:31
FORCEINLINE uint8_t InterlockedAddU8(volatile uint8_t *target, uint8_t value)
Definition atomic.h:113
FORCEINLINE uintptr_t InterlockedFetchAndUintptr(volatile uintptr_t *target, uintptr_t value)
Definition atomic.h:163
FORCEINLINE int16_t InterlockedCompareExchange16(volatile int16_t *target, int16_t value, int16_t comparand)
Definition atomic.h:55
FORCEINLINE int32_t InterlockedExchange32(volatile int32_t *target, int32_t value)
Definition atomic.h:36
FORCEINLINE uint32_t InterlockedExchangeU32(volatile uint32_t *target, uint32_t value)
Definition atomic.h:41
FORCEINLINE uintptr_t InterlockedExchangeUintptr(volatile uintptr_t *target, uintptr_t value)
Definition atomic.h:155
FORCEINLINE bool InterlockedExchangeBool(volatile bool *target, bool value)
Definition atomic.h:171
FORCEINLINE uint32_t InterlockedOrU32(volatile uint32_t *target, uint32_t value)
Definition atomic.h:149
FORCEINLINE void * InterlockedFetchPointer(volatile void *volatile *target)
Definition atomic.h:178
FORCEINLINE int32_t InterlockedFetch32(volatile int32_t *target)
Definition atomic.h:215
FORCEINLINE uint32_t InterlockedCompareExchangeU32(volatile uint32_t *target, uint32_t value, uint32_t comparand)
Definition atomic.h:81
FORCEINLINE int8_t InterlockedExchange8(volatile int8_t *target, int8_t value)
Definition atomic.h:34
FORCEINLINE void * InterlockedCompareExchangePtr(volatile void *volatile *target, void *value, void *comparand)
Definition atomic.h:99
FORCEINLINE uint64_t InterlockedAddU64(volatile uint64_t *target, uint64_t value)
Definition atomic.h:116
FORCEINLINE bool InterlockedDecrementIfNotZero(volatile uint64_t *value)
Definition atomic.h:229
FORCEINLINE uint16_t InterlockedAddU16(volatile uint16_t *target, uint16_t value)
Definition atomic.h:114
FORCEINLINE uint32_t InterlockedAndU32(volatile uint32_t *target, uint32_t value)
Definition atomic.h:139
FORCEINLINE uintptr_t InterlockedFetchOrUintptr(volatile uintptr_t *target, uintptr_t value)
Definition atomic.h:166
FORCEINLINE int16_t InterlockedOr16(volatile int16_t *target, int16_t value)
Definition atomic.h:143
FORCEINLINE int8_t InterlockedAnd8(volatile int8_t *target, int8_t value)
Definition atomic.h:132
FORCEINLINE bool InterlockedCompareExchangeU64_bool(volatile uint64_t *target, uint64_t value, uint64_t *expected)
Definition atomic.h:92
FORCEINLINE int64_t InterlockedExchange64(volatile int64_t *target, int64_t value)
Definition atomic.h:37
FORCEINLINE int16_t InterlockedExchange16(volatile int16_t *target, int16_t value)
Definition atomic.h:35
FORCEINLINE uint64_t InterlockedOrU64(volatile uint64_t *target, uint64_t value)
Definition atomic.h:150