Veritable Lasagna
An Allocator & Data Structure Library for C.
Loading...
Searching...
No Matches
vl_atomic.h
Go to the documentation of this file.
1#ifndef VL_ATOMIC_H
2#define VL_ATOMIC_H
3
4#ifdef __cplusplus
5#error The vl_atomic header does not work under C++ compilation due to using the _Atomic keyword.
6#endif
7
8#include <stdatomic.h>
9#include "vl_numtypes.h"
10
17#ifdef VL_ATOMIC
18#undef VL_ATOMIC
19#endif
20
21#ifdef VL_ATOMIC_TYPEDEF
22#undef VL_ATOMIC_TYPEDEF
23#endif
24
25#define VL_ATOMIC _Atomic
26#define VL_ATOMIC_TYPEDEF(x) typedef VL_ATOMIC x
27
28VL_ATOMIC_TYPEDEF(vl_bool_t) vl_atomic_bool_t;
29
30VL_ATOMIC_TYPEDEF(vl_int_t) vl_atomic_int_t;
31VL_ATOMIC_TYPEDEF(vl_uint_t) vl_atomic_uint_t;
32
33VL_ATOMIC_TYPEDEF(vl_intptr_t) vl_atomic_intptr_t;
34VL_ATOMIC_TYPEDEF(vl_uintptr_t) vl_atomic_uintptr_t;
35
36VL_ATOMIC_TYPEDEF(vl_ularge_t) vl_atomic_ularge_t;
37VL_ATOMIC_TYPEDEF(vl_usmall_t) vl_atomic_usmall_t;
38VL_ATOMIC_TYPEDEF(vl_ilarge_t) vl_atomic_ilarge_t;
39VL_ATOMIC_TYPEDEF(vl_ismall_t) vl_atomic_ismall_t;
40
41#ifdef VL_U8_T
42#define VL_ATOMIC_U8_T vl_atomic_uint8_t
43
44VL_ATOMIC_TYPEDEF(vl_uint8_t) VL_ATOMIC_U8_T;
45#endif
46
47#ifdef VL_U16_T
48#define VL_ATOMIC_U16_T vl_atomic_uint16_t
49
50VL_ATOMIC_TYPEDEF(vl_uint16_t) VL_ATOMIC_U16_T;
51#endif
52
53#ifdef VL_U32_T
54#define VL_ATOMIC_U32_T vl_atomic_uint32_t
55
56VL_ATOMIC_TYPEDEF(vl_uint32_t) VL_ATOMIC_U32_T;
57#endif
58
59#ifdef VL_U64_T
60#define VL_ATOMIC_U64_T vl_atomic_uint64_t
61
62VL_ATOMIC_TYPEDEF(vl_uint64_t) VL_ATOMIC_U64_T;
63#endif
64
65#ifdef VL_I8_T
66#define VL_ATOMIC_I8_T vl_atomic_int8_t
67
68VL_ATOMIC_TYPEDEF(vl_int8_t) VL_ATOMIC_I8_T;
69#endif
70
71#ifdef VL_I16_T
72#define VL_ATOMIC_I16_T vl_atomic_int16_t
73
74VL_ATOMIC_TYPEDEF(vl_int16_t) VL_ATOMIC_I16_T;
75#endif
76
77#ifdef VL_I32_T
78#define VL_ATOMIC_I32_T vl_atomic_int32_t
79
80VL_ATOMIC_TYPEDEF(vl_int32_t) VL_ATOMIC_I32_T;
81#endif
82
83#ifdef VL_I64_T
84#define VL_ATOMIC_I64_T vl_atomic_int64_t
85
86VL_ATOMIC_TYPEDEF(vl_int64_t) VL_ATOMIC_I64_T;
87#endif
88
89VL_ATOMIC_TYPEDEF(atomic_flag) vl_atomic_flag_t;
90
91
98typedef enum VL_MEMORY_ORDER{
105 VL_MEMORY_ORDER_RELAXED = memory_order_relaxed,
106
114 VL_MEMORY_ORDER_ACQUIRE = memory_order_acquire,
115
124 VL_MEMORY_ORDER_RELEASE = memory_order_release,
125
134 VL_MEMORY_ORDER_ACQ_REL = memory_order_acq_rel,
135
143 VL_MEMORY_ORDER_SEQ_CST = memory_order_seq_cst
145
146//Load & Store Ops
147
157#define vlAtomicLoad(ptr) atomic_load(ptr)
158
173#define vlAtomicLoadExplicit(ptr, order) atomic_load_explicit(ptr, (memory_order)(order))
174
184#define vlAtomicStore(ptr, val) atomic_store(ptr, val)
185
199#define vlAtomicStoreExplicit(ptr, order) atomic_store_explicit(ptr, (memory_order)(order))
200
201//Arithmetic
202
212#define vlAtomicFetchAdd(ptr, arg) atomic_fetch_add(ptr, arg)
213
223#define vlAtomicFetchSub(ptr, arg) atomic_fetch_sub(ptr, arg)
224
235#define vlAtomicFetchOr(ptr, arg) atomic_fetch_or(ptr, arg)
236
246#define vlAtomicFetchXor(ptr, arg) atomic_fetch_xor(ptr, arg)
247
257#define vlAtomicFetchAnd(ptr, arg) atomic_fetch_and(ptr, arg)
258
267#define vlAtomicFetchAddExplicit(ptr, arg, order) atomic_fetch_add_explicit(ptr, arg, (memory_order)(order))
268
277#define vlAtomicFetchSubExplicit(ptr, arg, order) atomic_fetch_sub_explicit(ptr, arg, (memory_order)(order))
278
287#define vlAtomicFetchOrExplicit(ptr, arg, order) atomic_fetch_or_explicit(ptr, arg, (memory_order)(order))
288
297#define vlAtomicFetchXorExplicit(ptr, arg, order) atomic_fetch_xor_explicit(ptr, arg, (memory_order)(order))
298
307#define vlAtomicFetchAndExplicit(ptr, arg, order) atomic_fetch_and_explicit(ptr, arg, (memory_order)(order))
308
309//Compare & Swap
310
329#define vlAtomicCompareExchangeWeak(ptr, expectedPtr, desired) atomic_compare_exchange_weak(ptr, expectedPtr, desired)
330
348#define vlAtomicCompareExchangeStrong(ptr, expectedPtr, desired) atomic_compare_exchange_strong(ptr, expectedPtr, desired)
349
368#define vlAtomicCompareExchangeWeakExplicit(ptr, expectedPtr, desired, trueOrder, falseOrder) atomic_compare_exchange_weak_explicit(ptr, expectedPtr, desired, (memory_order)(trueOrder), (memory_order)(falseOrder))
369
387#define vlAtomicCompareExchangeStrongExplicit(ptr, expectedPtr, desired, trueOrder, falseOrder) atomic_compare_exchange_strong_explicit(ptr, expectedPtr, desired, (memory_order)(trueOrder), (memory_order)(falseOrder))
388
389//Thread Fencing
390
397#define vlAtomicThreadFence(order) atomic_thread_fence((memory_order)(order))
398
408#define vlAtomicFlagTestAndSet(ptr) atomic_flag_test_and_set(ptr)
409
418#define vlAtomicFlagClear(ptr) atomic_flag_clear(ptr)
419
428#define vlAtomicFlagTestAndSetExplicit(ptr, order) atomic_flag_test_and_set_explicit(ptr, (memory_order)(order))
429
438#define vlAtomicFlagClearExplicit(ptr, order) atomic_flag_clear_explicit(ptr, (memory_order)(order))
439
440//Init
441
450#define vlAtomicInit(ptr) atomic_init(ptr)
451
452#undef VL_ATOMIC_TYPEDEF
453#endif //VL_ATOMIC_H
#define VL_ATOMIC_TYPEDEF(x)
Definition vl_atomic.h:26
vl_memory_order_t
Memory order enumeration. Dictates reordering of memory accesses surrounding and including atomic ope...
Definition vl_atomic.h:98
@ VL_MEMORY_ORDER_RELEASE
Definition vl_atomic.h:124
@ VL_MEMORY_ORDER_ACQUIRE
Definition vl_atomic.h:114
@ VL_MEMORY_ORDER_SEQ_CST
Definition vl_atomic.h:143
@ VL_MEMORY_ORDER_RELAXED
Definition vl_atomic.h:105
@ VL_MEMORY_ORDER_ACQ_REL
Definition vl_atomic.h:134
VL_ISMALL_T vl_ismall_t
Smallest available signed integer type.
Definition vl_numtypes.h:86
VL_UPTR_T vl_uintptr_t
Unsigned integer type suitable for expressing memory addresses.
Definition vl_numtypes.h:101
VL_UINT_T vl_uint_t
Standard unsigned integer type.
Definition vl_numtypes.h:96
VL_BOOL_T vl_bool_t
Definition vl_numtypes.h:128
VL_IPTR_T vl_intptr_t
Signed integer type suitable for expressing memory addresses.
Definition vl_numtypes.h:106
VL_USMALL_T vl_usmall_t
Smallest available unsigned integer type.
Definition vl_numtypes.h:82
VL_ULARGE_T vl_ularge_t
Largest available unsigned integer type.
Definition vl_numtypes.h:74
VL_ILARGE_T vl_ilarge_t
Largest available signed integer type.
Definition vl_numtypes.h:78
VL_INT_T vl_int_t
Standard signed integer type.
Definition vl_numtypes.h:91