60 #error "this stdatomic.h does not support your compiler" 61 #endif // !defined(_WIN32) 63 #ifndef RCUTILS__STDATOMIC_HELPER__WIN32__STDATOMIC_H_ 64 #define RCUTILS__STDATOMIC_HELPER__WIN32__STDATOMIC_H_ 75 #define _Atomic(T) struct { T __val; } 81 #define ATOMIC_VAR_INIT(value) {.__val = (value)} 82 #define atomic_init(obj, value) do { \ 83 (obj)->__val = (value); \ 92 #ifndef __ATOMIC_RELAXED 93 #define __ATOMIC_RELAXED 0 95 #ifndef __ATOMIC_CONSUME 96 #define __ATOMIC_CONSUME 1 98 #ifndef __ATOMIC_ACQUIRE 99 #define __ATOMIC_ACQUIRE 2 101 #ifndef __ATOMIC_RELEASE 102 #define __ATOMIC_RELEASE 3 104 #ifndef __ATOMIC_ACQ_REL 105 #define __ATOMIC_ACQ_REL 4 107 #ifndef __ATOMIC_SEQ_CST 108 #define __ATOMIC_SEQ_CST 5 134 #define atomic_thread_fence(order) MemoryBarrier() 135 #define atomic_signal_fence(order) _ReadWriteBarrier() 141 #define atomic_is_lock_free(obj) (sizeof((obj)->__val) <= sizeof(void *)) 147 typedef _Atomic (_Bool) atomic_bool;
148 typedef _Atomic (
char) atomic_char;
149 typedef _Atomic (
signed char) atomic_schar;
150 typedef _Atomic (
unsigned char) atomic_uchar;
151 typedef _Atomic (
short) atomic_short;
152 typedef _Atomic (
unsigned short) atomic_ushort;
153 typedef _Atomic (
int) atomic_int;
154 typedef _Atomic (
unsigned int) atomic_uint;
155 typedef _Atomic (
long) atomic_long;
156 typedef _Atomic (
unsigned long) atomic_ulong;
157 typedef _Atomic (
long long) atomic_llong;
158 typedef _Atomic (
unsigned long long) atomic_ullong;
160 typedef _Atomic (char16_t) atomic_char16_t;
161 typedef _Atomic (char32_t) atomic_char32_t;
162 typedef _Atomic (
wchar_t) atomic_wchar_t;
163 typedef _Atomic (int_least8_t) atomic_int_least8_t;
164 typedef _Atomic (uint_least8_t) atomic_uint_least8_t;
166 typedef _Atomic (int_least16_t) atomic_int_least16_t;
167 typedef _Atomic (uint_least16_t) atomic_uint_least16_t;
168 typedef _Atomic (int_least32_t) atomic_int_least32_t;
169 typedef _Atomic (uint_least32_t) atomic_uint_least32_t;
170 typedef _Atomic (int_least64_t) atomic_int_least64_t;
171 typedef _Atomic (uint_least64_t) atomic_uint_least64_t;
173 typedef _Atomic (int_fast8_t) atomic_int_fast8_t;
174 typedef _Atomic (uint_fast8_t) atomic_uint_fast8_t;
176 typedef _Atomic (int_fast16_t) atomic_int_fast16_t;
177 typedef _Atomic (uint_fast16_t) atomic_uint_fast16_t;
178 typedef _Atomic (int_fast32_t) atomic_int_fast32_t;
179 typedef _Atomic (uint_fast32_t) atomic_uint_fast32_t;
180 typedef _Atomic (int_fast64_t) atomic_int_fast64_t;
181 typedef _Atomic (uint_fast64_t) atomic_uint_fast64_t;
182 typedef _Atomic (intptr_t) atomic_intptr_t;
183 typedef _Atomic (uintptr_t) atomic_uintptr_t;
184 typedef _Atomic (
size_t) atomic_size_t;
185 typedef _Atomic (ptrdiff_t) atomic_ptrdiff_t;
186 typedef _Atomic (intmax_t) atomic_intmax_t;
187 typedef _Atomic (uintmax_t) atomic_uintmax_t;
189 #ifdef ROS_PACKAGE_NAME 190 #define _RCUTILS_PACKAGE_NAME ROS_PACKAGE_NAME 192 #define _RCUTILS_PACKAGE_NAME "<Unknown Package>" 199 #define rcutils_win32_atomic_compare_exchange_strong(object, out, expected, desired) \ 200 __pragma(warning(push)) \ 201 __pragma(warning(disable: 4244)) \ 202 __pragma(warning(disable: 4047)) \ 203 __pragma(warning(disable: 4024)) \ 205 switch (sizeof(out)) { \ 206 case sizeof(uint64_t): \ 207 out = _InterlockedCompareExchange64((LONGLONG *) object, desired, *expected); \ 209 case sizeof(uint32_t): \ 210 out = _InterlockedCompareExchange((LONG *) object, desired, *expected); \ 212 case sizeof(uint16_t): \ 213 out = _InterlockedCompareExchange16((SHORT *) object, desired, *expected); \ 215 case sizeof(uint8_t): \ 216 out = _InterlockedCompareExchange8((char *) object, desired, *expected); \ 219 RCUTILS_LOG_ERROR_NAMED( \ 220 _RCUTILS_PACKAGE_NAME, "Unsupported integer type in atomic_compare_exchange_strong"); \ 225 __pragma(warning(pop)) 227 #define rcutils_win32_atomic_compare_exchange_weak(object, out, expected, desired) \ 228 rcutils_win32_atomic_compare_exchange_strong(object, out, expected, desired) 230 #define rcutils_win32_atomic_exchange(object, out, desired) \ 231 __pragma(warning(push)) \ 232 __pragma(warning(disable: 4244)) \ 233 __pragma(warning(disable: 4047)) \ 234 __pragma(warning(disable: 4024)) \ 236 switch (sizeof(out)) { \ 237 case sizeof(uint64_t): \ 238 out = _InterlockedExchange64((LONGLONG *) object, desired); \ 240 case sizeof(uint32_t): \ 241 out = _InterlockedExchange((LONG *) object, desired); \ 243 case sizeof(uint16_t): \ 244 out = _InterlockedExchange16((SHORT *) object, desired); \ 246 case sizeof(uint8_t): \ 247 out = _InterlockedExchange8((char *) object, desired); \ 250 RCUTILS_LOG_ERROR_NAMED( \ 251 _RCUTILS_PACKAGE_NAME, "Unsupported integer type in atomic_exchange_strong"); \ 256 __pragma(warning(pop)) 258 #define rcutils_win32_atomic_fetch_add(object, out, operand) \ 259 __pragma(warning(push)) \ 260 __pragma(warning(disable: 4244)) \ 261 __pragma(warning(disable: 4047)) \ 262 __pragma(warning(disable: 4024)) \ 264 switch (sizeof(out)) { \ 265 case sizeof(uint64_t): \ 266 out = _InterlockedExchangeAdd64((LONGLONG *) object, operand); \ 268 case sizeof(uint32_t): \ 269 out = _InterlockedExchangeAdd((LONG *) object, operand); \ 271 case sizeof(uint16_t): \ 272 out = _InterlockedExchangeAdd16((SHORT *) object, operand); \ 274 case sizeof(uint8_t): \ 275 out = _InterlockedExchangeAdd8((char *) object, operand); \ 278 RCUTILS_LOG_ERROR_NAMED( \ 279 _RCUTILS_PACKAGE_NAME, "Unsupported integer type in atomic_fetch_add"); \ 284 __pragma(warning(pop)) 286 #define rcutils_win32_atomic_fetch_and(object, out, operand) \ 287 __pragma(warning(push)) \ 288 __pragma(warning(disable: 4244)) \ 289 __pragma(warning(disable: 4047)) \ 290 __pragma(warning(disable: 4024)) \ 292 switch (sizeof(out)) { \ 293 case sizeof(uint64_t): \ 294 out = _InterlockedAnd64((LONGLONG *) object, operand); \ 296 case sizeof(uint32_t): \ 297 out = _InterlockedAnd((LONG *) object, operand); \ 299 case sizeof(uint16_t): \ 300 out = _InterlockedAnd16((SHORT *) object, operand); \ 302 case sizeof(uint8_t): \ 303 out = _InterlockedAnd8((char *) object, operand); \ 306 RCUTILS_LOG_ERROR_NAMED( \ 307 _RCUTILS_PACKAGE_NAME, "Unsupported integer type in atomic_fetch_and"); \ 312 __pragma(warning(pop)) 314 #define rcutils_win32_atomic_fetch_or(object, out, operand) \ 315 __pragma(warning(push)) \ 316 __pragma(warning(disable: 4244)) \ 317 __pragma(warning(disable: 4047)) \ 318 __pragma(warning(disable: 4024)) \ 320 switch (sizeof(out)) { \ 321 case sizeof(uint64_t): \ 322 out = _InterlockedOr64((LONGLONG *) object, operand); \ 324 case sizeof(uint32_t): \ 325 out = _InterlockedOr((LONG *) object, operand); \ 327 case sizeof(uint16_t): \ 328 out = _InterlockedOr16((SHORT *) object, operand); \ 330 case sizeof(uint8_t): \ 331 out = _InterlockedOr8((char *) object, operand); \ 334 RCUTILS_LOG_ERROR_NAMED( \ 335 _RCUTILS_PACKAGE_NAME, "Unsupported integer type in atomic_fetch_or"); \ 340 __pragma(warning(pop)) 342 #define rcutils_win32_atomic_fetch_sub(object, out, operand) \ 343 rcutils_win32_atomic_fetch_add(object, out, -(operand)) 345 #define rcutils_win32_atomic_fetch_xor(object, out, operand) \ 346 __pragma(warning(push)) \ 347 __pragma(warning(disable: 4244)) \ 348 __pragma(warning(disable: 4047)) \ 349 __pragma(warning(disable: 4024)) \ 351 switch (sizeof(out)) { \ 352 case sizeof(uint64_t): \ 353 out = _InterlockedXor64((LONGLONG *) object, operand); \ 355 case sizeof(uint32_t): \ 356 out = _InterlockedXor((LONG *) object, operand); \ 358 case sizeof(uint16_t): \ 359 out = _InterlockedXor16((SHORT *) object, operand); \ 361 case sizeof(uint8_t): \ 362 out = _InterlockedXor8((char *) object, operand); \ 365 RCUTILS_LOG_ERROR_NAMED( \ 366 _RCUTILS_PACKAGE_NAME, "Unsupported integer type in atomic_fetch_xor"); \ 371 __pragma(warning(pop)) 373 #define rcutils_win32_atomic_load(object, out) \ 374 __pragma(warning(push)) \ 375 __pragma(warning(disable: 4244)) \ 376 __pragma(warning(disable: 4047)) \ 377 __pragma(warning(disable: 4024)) \ 379 switch (sizeof(out)) { \ 380 case sizeof(uint64_t): \ 381 out = _InterlockedExchangeAdd64((LONGLONG *) object, 0); \ 383 case sizeof(uint32_t): \ 384 out = _InterlockedExchangeAdd((LONG *) object, 0); \ 386 case sizeof(uint16_t): \ 387 out = _InterlockedExchangeAdd16((SHORT *) object, 0); \ 389 case sizeof(uint8_t): \ 390 out = _InterlockedExchangeAdd8((char *) object, 0); \ 393 RCUTILS_LOG_ERROR_NAMED( \ 394 _RCUTILS_PACKAGE_NAME, "Unsupported integer type in atomic_load"); \ 399 __pragma(warning(pop)) 401 #define rcutils_win32_atomic_store(object, desired) \ 404 (object)->__val = (desired); \ 426 #endif // RCUTILS__STDATOMIC_HELPER__WIN32__STDATOMIC_H_ #define __ATOMIC_SEQ_CST
Definition: stdatomic.h:108
Definition: stdatomic.h:163
Definition: stdatomic.h:164
Definition: stdatomic.h:165
Definition: stdatomic.h:166
memory_order
Definition: stdatomic.h:160
Definition: stdatomic.h:161
#define __ATOMIC_RELEASE
Definition: stdatomic.h:102
#define _Atomic(T)
Definition: stdatomic.h:75
#define __ATOMIC_ACQ_REL
Definition: stdatomic.h:105
Definition: stdatomic.h:162
#define __ATOMIC_ACQUIRE
Definition: stdatomic.h:99
#define __ATOMIC_CONSUME
Definition: stdatomic.h:96
#define __ATOMIC_RELAXED
Definition: stdatomic.h:93