Veritable Lasagna
An Allocator & Data Structure Library for C.
Loading...
Searching...
No Matches
vl_atomic.h
Go to the documentation of this file.
1
14#ifndef VL_ATOMIC_H
15#define VL_ATOMIC_H
16
17#ifdef __cplusplus
18#error The vl_atomic header does not work under C++ compilation due to the use of the _Atomic keyword.
19#endif
20
21#include <stdatomic.h>
22
23#include "vl_numtypes.h"
24
32#ifdef VL_ATOMIC
33#undef VL_ATOMIC
34#endif
35
36#ifdef VL_ATOMIC_TYPEDEF
37#undef VL_ATOMIC_TYPEDEF
38#endif
39
40#define VL_ATOMIC _Atomic
41#define VL_ATOMIC_TYPEDEF(x) typedef VL_ATOMIC x
42
43VL_ATOMIC_TYPEDEF(vl_bool_t) vl_atomic_bool_t;
44
45VL_ATOMIC_TYPEDEF(vl_int_t) vl_atomic_int_t;
46VL_ATOMIC_TYPEDEF(vl_uint_t) vl_atomic_uint_t;
47
48VL_ATOMIC_TYPEDEF(vl_intptr_t) vl_atomic_intptr_t;
49VL_ATOMIC_TYPEDEF(vl_uintptr_t) vl_atomic_uintptr_t;
50
51VL_ATOMIC_TYPEDEF(vl_ularge_t) vl_atomic_ularge_t;
52VL_ATOMIC_TYPEDEF(vl_usmall_t) vl_atomic_usmall_t;
53VL_ATOMIC_TYPEDEF(vl_ilarge_t) vl_atomic_ilarge_t;
54VL_ATOMIC_TYPEDEF(vl_ismall_t) vl_atomic_ismall_t;
55
56#ifdef VL_U8_T
57#define VL_ATOMIC_U8_T vl_atomic_uint8_t
58
59VL_ATOMIC_TYPEDEF(vl_uint8_t) VL_ATOMIC_U8_T;
60#endif
61
62#ifdef VL_U16_T
63#define VL_ATOMIC_U16_T vl_atomic_uint16_t
64
65VL_ATOMIC_TYPEDEF(vl_uint16_t) VL_ATOMIC_U16_T;
66#endif
67
68#ifdef VL_U32_T
69#define VL_ATOMIC_U32_T vl_atomic_uint32_t
70
71VL_ATOMIC_TYPEDEF(vl_uint32_t) VL_ATOMIC_U32_T;
72#endif
73
74#ifdef VL_U64_T
75#define VL_ATOMIC_U64_T vl_atomic_uint64_t
76
77VL_ATOMIC_TYPEDEF(vl_uint64_t) VL_ATOMIC_U64_T;
78#endif
79
80#ifdef VL_I8_T
81#define VL_ATOMIC_I8_T vl_atomic_int8_t
82
83VL_ATOMIC_TYPEDEF(vl_int8_t) VL_ATOMIC_I8_T;
84#endif
85
86#ifdef VL_I16_T
87#define VL_ATOMIC_I16_T vl_atomic_int16_t
88
89VL_ATOMIC_TYPEDEF(vl_int16_t) VL_ATOMIC_I16_T;
90#endif
91
92#ifdef VL_I32_T
93#define VL_ATOMIC_I32_T vl_atomic_int32_t
94
95VL_ATOMIC_TYPEDEF(vl_int32_t) VL_ATOMIC_I32_T;
96#endif
97
98#ifdef VL_I64_T
99#define VL_ATOMIC_I64_T vl_atomic_int64_t
100
101VL_ATOMIC_TYPEDEF(vl_int64_t) VL_ATOMIC_I64_T;
102#endif
103
104VL_ATOMIC_TYPEDEF(atomic_flag) vl_atomic_flag_t;
105
113typedef enum VL_MEMORY_ORDER
114{
122 VL_MEMORY_ORDER_RELAXED = memory_order_relaxed,
123
132 VL_MEMORY_ORDER_ACQUIRE = memory_order_acquire,
133
143 VL_MEMORY_ORDER_RELEASE = memory_order_release,
144
156 VL_MEMORY_ORDER_ACQ_REL = memory_order_acq_rel,
157
167 VL_MEMORY_ORDER_SEQ_CST = memory_order_seq_cst
169
170// Load & Store Ops
171
181#define vlAtomicLoad(ptr) atomic_load(ptr)
182
197#define vlAtomicLoadExplicit(ptr, order) atomic_load_explicit(ptr, (memory_order)(order))
198
208#define vlAtomicStore(ptr, val) atomic_store(ptr, val)
209
224#define vlAtomicStoreExplicit(ptr, val, order) atomic_store_explicit(ptr, val, (memory_order)(order))
225
226// Arithmetic
227
238#define vlAtomicFetchAdd(ptr, arg) atomic_fetch_add(ptr, arg)
239
250#define vlAtomicFetchSub(ptr, arg) atomic_fetch_sub(ptr, arg)
251
263#define vlAtomicFetchOr(ptr, arg) atomic_fetch_or(ptr, arg)
264
275#define vlAtomicFetchXor(ptr, arg) atomic_fetch_xor(ptr, arg)
276
287#define vlAtomicFetchAnd(ptr, arg) atomic_fetch_and(ptr, arg)
288
298#define vlAtomicFetchAddExplicit(ptr, arg, order) atomic_fetch_add_explicit(ptr, arg, (memory_order)(order))
299
309#define vlAtomicFetchSubExplicit(ptr, arg, order) atomic_fetch_sub_explicit(ptr, arg, (memory_order)(order))
310
320#define vlAtomicFetchOrExplicit(ptr, arg, order) atomic_fetch_or_explicit(ptr, arg, (memory_order)(order))
321
331#define vlAtomicFetchXorExplicit(ptr, arg, order) atomic_fetch_xor_explicit(ptr, arg, (memory_order)(order))
332
342#define vlAtomicFetchAndExplicit(ptr, arg, order) atomic_fetch_and_explicit(ptr, arg, (memory_order)(order))
343
344// Exchange, Compare & Swap
345
359#define vlAtomicExchange(ptr, desired) atomic_exchange(ptr, desired)
360
373#define vlAtomicExchangeExplicit(ptr, desired, order) atomic_exchange_explicit(ptr, desired, (memory_order)(order))
374
395#define vlAtomicCompareExchangeWeak(ptr, expectedPtr, desired) atomic_compare_exchange_weak(ptr, expectedPtr, desired)
396
416#define vlAtomicCompareExchangeStrong(ptr, expectedPtr, desired) \
417 atomic_compare_exchange_strong(ptr, expectedPtr, desired)
418
439#define vlAtomicCompareExchangeWeakExplicit(ptr, expectedPtr, desired, trueOrder, falseOrder) \
440 atomic_compare_exchange_weak_explicit(ptr, expectedPtr, desired, (memory_order)(trueOrder), \
441 (memory_order)(falseOrder))
442
462#define vlAtomicCompareExchangeStrongExplicit(ptr, expectedPtr, desired, trueOrder, falseOrder) \
463 atomic_compare_exchange_strong_explicit(ptr, expectedPtr, desired, (memory_order)(trueOrder), \
464 (memory_order)(falseOrder))
465
466// Thread Fencing
467
475#define vlAtomicThreadFence(order) atomic_thread_fence((memory_order)(order))
476
486#define vlAtomicFlagTestAndSet(ptr) atomic_flag_test_and_set(ptr)
487
496#define vlAtomicFlagClear(ptr) atomic_flag_clear(ptr)
497
506#define vlAtomicFlagTestAndSetExplicit(ptr, order) atomic_flag_test_and_set_explicit(ptr, (memory_order)(order))
507
516#define vlAtomicFlagClearExplicit(ptr, order) atomic_flag_clear_explicit(ptr, (memory_order)(order))
517
518// Init
519
530#define vlAtomicInit(ptr, val) atomic_init(ptr, val)
531
532#undef VL_ATOMIC_TYPEDEF
533#endif // VL_ATOMIC_H
#define VL_ATOMIC_TYPEDEF(x)
Definition vl_atomic.h:41
vl_memory_order_t
Memory order enumeration. Dictates reordering of memory accesses surrounding and including atomic ope...
Definition vl_atomic.h:114
@ VL_MEMORY_ORDER_RELEASE
Definition vl_atomic.h:143
@ VL_MEMORY_ORDER_ACQUIRE
Definition vl_atomic.h:132
@ VL_MEMORY_ORDER_SEQ_CST
Definition vl_atomic.h:167
@ VL_MEMORY_ORDER_RELAXED
Definition vl_atomic.h:122
@ VL_MEMORY_ORDER_ACQ_REL
Definition vl_atomic.h:156
VL_ISMALL_T vl_ismall_t
Smallest available signed integer type.
Definition vl_numtypes.h:148
VL_UPTR_T vl_uintptr_t
Unsigned integer type suitable for expressing memory addresses.
Definition vl_numtypes.h:163
VL_UINT_T vl_uint_t
Standard unsigned integer type.
Definition vl_numtypes.h:158
VL_BOOL_T vl_bool_t
Definition vl_numtypes.h:191
VL_IPTR_T vl_intptr_t
Signed integer type suitable for expressing memory addresses.
Definition vl_numtypes.h:168
VL_USMALL_T vl_usmall_t
Smallest available unsigned integer type.
Definition vl_numtypes.h:144
VL_ULARGE_T vl_ularge_t
Largest available unsigned integer type.
Definition vl_numtypes.h:136
VL_ILARGE_T vl_ilarge_t
Largest available signed integer type.
Definition vl_numtypes.h:140
VL_INT_T vl_int_t
Standard signed integer type.
Definition vl_numtypes.h:153