|
1 | 1 | // Copyright 2015 Jeff Epler |
| 2 | +// Copyright 2026 B.Stultiens |
2 | 3 | // |
3 | 4 | // This program is free software; you can redistribute it and/or modify |
4 | 5 | // it under the terms of the GNU General Public License as published by |
|
16 | 17 | #ifndef __LINUXCNC_RTAPI_ATOMIC_H |
17 | 18 | #define __LINUXCNC_RTAPI_ATOMIC_H |
18 | 19 |
|
19 | | -#if defined(__GNUC__) && ((__GNUC__ << 8) | __GNUC_MINOR__) >= 0x409 |
| 20 | +#if defined(__cplusplus) |
| 21 | + |
| 22 | +// We use C++20 and that has all the atomics we need |
| 23 | +#include <atomic> |
| 24 | + |
| 25 | +#else // defined(__cplusplus) |
| 26 | + |
| 27 | +// Standard C, we require C11 or better |
| 28 | +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L |
20 | 29 | #define RTAPI_USE_STDATOMIC |
21 | | -#elif defined(__STDC_VERSION__) && __STDC_VERSION > 201112L |
| 30 | +#elif defined(__GNUC__) && ((__GNUC__ << 8) | __GNUC_MINOR__) >= 0x409 |
22 | 31 | #define RTAPI_USE_STDATOMIC |
23 | 32 | #endif |
24 | 33 |
|
25 | | -#ifdef RTAPI_USE_STDATOMIC |
| 34 | +#if defined(RTAPI_USE_STDATOMIC) |
26 | 35 | #include <stdatomic.h> |
27 | | -#else |
28 | 36 |
|
29 | | -enum memory_order { |
30 | | - memory_order_relaxed, |
31 | | - memory_order_consume, |
32 | | - memory_order_acquire, |
33 | | - memory_order_release, |
34 | | - memory_order_acq_rel, |
35 | | - memory_order_seq_cst |
36 | | -}; |
| 37 | +#if defined(__STDC_NO_ATOMICS__) |
| 38 | +#error "Your compiler/libc has set __STDC_NO_ATOMICS__ and atomics are required." |
| 39 | +#endif |
37 | 40 |
|
38 | | -#define atomic_store(obj, desired) atomic_store_explicit((obj), (desired), memory_order_seq_cst) |
39 | | -#define atomic_load(obj) atomic_load_explicit((obj), memory_order_seq_cst) |
| 41 | +#else // defined(RTAPI_USE_STDATOMIC) |
40 | 42 |
|
41 | | -// note that in this implementation, only one level of synchronization is supported, equivalent to memory_order_seq_cst |
42 | | -#define atomic_store_explicit(obj, desired, order) \ |
43 | | - ({ (void)order; __sync_synchronize(); *(obj) = (desired); (void)0; }) |
| 43 | +#error "Old compiler has no C11 atomics. Please upgrade your compiler to support C11 or better." |
44 | 44 |
|
45 | | -#define atomic_load_explicit(obj, order) \ |
46 | | - ({ (void)order; __typeof__(*(obj)) v = *(obj); __sync_synchronize(); v; }) |
| 45 | +#endif // defined(RTAPI_USE_STDATOMIC) |
47 | 46 |
|
48 | | -#endif |
| 47 | +#endif // defined(__cplusplus) |
49 | 48 |
|
50 | 49 | #endif |
0 commit comments