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#ifndef VL_ATOMIC_PTR_H
2#define VL_ATOMIC_PTR_H
3
4#include "vl_atomic.h"
5
23
29
38extern const vl_tagged_ptr VL_TAGPTR_NULL;
39
40#define vlAtomicPtrInit(atPtr, valPtr) vlAtomicInit((atPtr), valPtr);
41
52static inline void vlAtomicPtrStore(vl_atomic_ptr* atomicPtr, void* ptr){
53 vl_tagged_ptr pV = vlAtomicLoad(atomicPtr);
54
55 pV.ptr = (vl_uintptr_t)ptr;
56 pV.tag++;
57
58 vlAtomicStore(atomicPtr, pV);
59}
60
76static inline vl_bool_t vlAtomicPtrCompareExchangeStrongExplicit(vl_atomic_ptr* atPtr, vl_tagged_ptr* expected, const void* newValue, vl_memory_order_t trueOrder, vl_memory_order_t falseOrder){
77 vl_tagged_ptr result = *expected;
78 result.ptr = (vl_uintptr_t)newValue;
79 result.tag++;
80 return vlAtomicCompareExchangeStrongExplicit(atPtr, expected, result, trueOrder, falseOrder);
81}
82
98static inline vl_bool_t vlAtomicPtrCompareExchangeWeakExplicit(vl_atomic_ptr* atPtr, vl_tagged_ptr* expected, const void* newValue, vl_memory_order_t trueOrder, vl_memory_order_t falseOrder){
99 vl_tagged_ptr result = *expected;
100 result.ptr = (vl_uintptr_t)newValue;
101 result.tag++;
102 return vlAtomicCompareExchangeWeakExplicit(atPtr, expected, result, trueOrder, falseOrder);
103}
104
115#define vlAtomicPtrCompareExchangeStrong(atPtr, atPtrExpected, valPtr)\
116 vlAtomicPtrCompareExchangeStrongExplicit(atPtr, atPtrExpected, valPtr, VL_MEMORY_ORDER_SEQ_CST, VL_MEMORY_ORDER_SEQ_CST)
117
128#define vlAtomicPtrCompareExchangeWeak(atPtr, atPtrExpected, valPtr)\
129 vlAtomicPtrCompareExchangeWeakExplicit(atPtr, atPtrExpected, valPtr, VL_MEMORY_ORDER_SEQ_CST, VL_MEMORY_ORDER_SEQ_CST)
130
131#endif //VL_ATOMIC_PTR_H
#define vlAtomicStore(ptr, val)
Performs a generic atomic write operation.
Definition vl_atomic.h:184
#define VL_ATOMIC
Definition vl_atomic.h:25
#define vlAtomicCompareExchangeStrongExplicit(ptr, expectedPtr, desired, trueOrder, falseOrder)
Atomically compares the memory at ptr with. If *ptr == *expectedPtr, *ptr = desired.
Definition vl_atomic.h:415
#define vlAtomicCompareExchangeWeakExplicit(ptr, expectedPtr, desired, trueOrder, falseOrder)
Atomically compares the memory at ptr with. If *ptr == *expectedPtr, *ptr = desired.
Definition vl_atomic.h:396
#define vlAtomicLoad(ptr)
Performs a generic atomic read operation.
Definition vl_atomic.h:157
vl_memory_order_t
Memory order enumeration. Dictates reordering of memory accesses surrounding and including atomic ope...
Definition vl_atomic.h:98
const vl_tagged_ptr VL_TAGPTR_NULL
Default initialization value for tagged/atomic pointers.
Definition vl_atomic_ptr.c:3
vl_uintptr_t ptr
Definition vl_atomic_ptr.h:20
vl_ularge_t tag
Definition vl_atomic_ptr.h:21
VL_ATOMIC vl_tagged_ptr vl_atomic_ptr
Atomic variant of vl_tagged_ptr.
Definition vl_atomic_ptr.h:28
A Tagged Pointer structure for use with Atomic, lock-free algorithms.
Definition vl_atomic_ptr.h:19
VL_UPTR_T vl_uintptr_t
Unsigned integer type suitable for expressing memory addresses.
Definition vl_numtypes.h:101
VL_BOOL_T vl_bool_t
Definition vl_numtypes.h:128
VL_ULARGE_T vl_ularge_t
Largest available unsigned integer type.
Definition vl_numtypes.h:74