Veritable Lasagna
An Allocator & Data Structure Library for C.
Loading...
Searching...
No Matches
vl_atomic_ptr.h
Go to the documentation of this file.
1
14#ifndef VL_ATOMIC_PTR_H
15#define VL_ATOMIC_PTR_H
16
17#include "vl_atomic.h"
18#include "vl_memory.h"
19
33#if defined(_MSC_VER)
34#pragma warning(push)
35#pragma warning(disable : 4324)
36#endif
37typedef VL_ALIGN_HINT(16) struct vl_tagged_ptr
38{
39 vl_uintptr_t ptr;
40 vl_ularge_t tag;
42#if defined(_MSC_VER)
43#pragma warning(pop)
44#endif
45
50#define VL_ATOMIC_PTR_ALIGN sizeof(vl_tagged_ptr)
51
56#if defined(_MSC_VER)
57#pragma warning(push)
58#pragma warning(disable : 4324)
59#endif
61#if defined(_MSC_VER)
62#pragma warning(pop)
63#endif
64
73VL_API extern const vl_tagged_ptr VL_TAGPTR_NULL;
74
87static inline void vlAtomicPtrStore(vl_atomic_ptr* atomicPtr, void* ptr)
88{
89 vl_tagged_ptr pV = vlAtomicLoad(atomicPtr);
90
91 pV.ptr = (vl_uintptr_t)ptr;
92 pV.tag++;
93
94 vlAtomicStore(atomicPtr, pV);
95}
96
114static inline vl_bool_t vlAtomicPtrCompareExchangeStrongExplicit(vl_atomic_ptr* atPtr, vl_tagged_ptr* expected,
115 const void* newValue, vl_memory_order_t trueOrder,
116 vl_memory_order_t falseOrder)
117{
118 (void)trueOrder;
119 (void)falseOrder;
120 vl_tagged_ptr result = *expected;
121 result.ptr = (vl_uintptr_t)newValue;
122 result.tag++;
123 return vlAtomicCompareExchangeStrongExplicit(atPtr, expected, result, trueOrder, falseOrder);
124}
125
142static inline vl_bool_t vlAtomicPtrCompareExchangeWeakExplicit(vl_atomic_ptr* atPtr, vl_tagged_ptr* expected,
143 const void* newValue, vl_memory_order_t trueOrder,
144 vl_memory_order_t falseOrder)
145{
146 (void)trueOrder;
147 (void)falseOrder;
148 vl_tagged_ptr result = *expected;
149 result.ptr = (vl_uintptr_t)newValue;
150 result.tag++;
151 return vlAtomicCompareExchangeWeakExplicit(atPtr, expected, result, trueOrder, falseOrder);
152}
153
165#define vlAtomicPtrCompareExchangeStrong(atPtr, atPtrExpected, valPtr) \
166 vlAtomicPtrCompareExchangeStrongExplicit(atPtr, atPtrExpected, valPtr, VL_MEMORY_ORDER_SEQ_CST, \
167 VL_MEMORY_ORDER_SEQ_CST)
168
180#define vlAtomicPtrCompareExchangeWeak(atPtr, atPtrExpected, valPtr) \
181 vlAtomicPtrCompareExchangeWeakExplicit(atPtr, atPtrExpected, valPtr, VL_MEMORY_ORDER_SEQ_CST, \
182 VL_MEMORY_ORDER_SEQ_CST)
183
184#endif // VL_ATOMIC_PTR_H
#define vlAtomicStore(ptr, val)
Performs a generic atomic write operation.
Definition vl_atomic.h:208
#define VL_ATOMIC
Definition vl_atomic.h:40
#define vlAtomicCompareExchangeStrongExplicit(ptr, expectedPtr, desired, trueOrder, falseOrder)
Atomically compares the memory at ptr with. If *ptr == *expectedPtr, *ptr = desired.
Definition vl_atomic.h:462
#define vlAtomicCompareExchangeWeakExplicit(ptr, expectedPtr, desired, trueOrder, falseOrder)
Atomically compares the memory at ptr with. If *ptr == *expectedPtr, *ptr = desired.
Definition vl_atomic.h:439
#define vlAtomicLoad(ptr)
Performs a generic atomic read operation.
Definition vl_atomic.h:181
vl_memory_order_t
Memory order enumeration. Dictates reordering of memory accesses surrounding and including atomic ope...
Definition vl_atomic.h:114
vl_tagged_ptr
Definition vl_atomic_ptr.h:41
VL_API const vl_tagged_ptr VL_TAGPTR_NULL
Default initialization value for tagged/atomic pointers.
Definition vl_atomic_ptr.c:3
VL_ATOMIC vl_tagged_ptr vl_atomic_ptr
Atomic variant of vl_tagged_ptr.
Definition vl_atomic_ptr.h:60
#define VL_ALIGN_HINT(x)
Structure alignment hint.
Definition vl_memory.h:90
VL_UPTR_T vl_uintptr_t
Unsigned integer type suitable for expressing memory addresses.
Definition vl_numtypes.h:163
VL_BOOL_T vl_bool_t
Definition vl_numtypes.h:191
VL_ULARGE_T vl_ularge_t
Largest available unsigned integer type.
Definition vl_numtypes.h:136