4 #ifndef __W_MARKABLE_POINTER_H 5 #define __W_MARKABLE_POINTER_H 118 static const uint64_t
MARK_BIT = 0x0000000000000001LL;
182 uint64_t stamp_shifted =
static_cast<uint64_t
>(stamp) << STAMP_SHIFT;
203 return (
_pointer & POINTER_MASK) == 0;
223 bool expected_mark,
bool new_mark,
247 uint64_t stamp_shifted =
static_cast<uint64_t
>(stamp) << STAMP_SHIFT;
248 return cast_to_int(ptr) | (mark ? MARK_BIT : 0) | stamp_shifted;
253 return reinterpret_cast<uintptr_t
>(
reinterpret_cast<void*
>(ptr));
258 return reinterpret_cast<T*
>(
reinterpret_cast<void*
>(ptr));
296 : next(other.next) {}
309 bool expected_mark,
bool desired_mark,
aba_stamp expected_stamp,
311 uintptr_t expected =
combine(expected_pointer, expected_mark, expected_stamp);
312 uintptr_t desired =
combine(desired_pointer, desired_mark, new_stamp);
313 return lintel::unsafe::atomic_compare_exchange_strong<uintptr_t>(
320 uintptr_t expected_tmp = expected.
_pointer;
321 return lintel::unsafe::atomic_compare_exchange_strong<uintptr_t>(
327 uintptr_t old = lintel::unsafe::atomic_exchange<uintptr_t>(&
_pointer, new_ptr.
_pointer);
334 inline std::ostream& operator<<(std::ostream& o, const MarkablePointer<T>& x) {
335 o <<
"Markable pointer ";
339 o << x.as_int() <<
" <marked=" << x.is_marked() <<
", stamp=" << x.get_aba_stamp()
340 <<
", ptr=" << *(x.get_pointer()) <<
">";
345 #endif // __W_MARKABLE_POINTER_H static uintptr_t cast_to_int(T *ptr)
Definition: w_markable_pointer.h:252
bool operator!=(const MarkablePointer &other) const
Definition: w_markable_pointer.h:158
bool operator==(const MarkablePointer &other) const
Definition: w_markable_pointer.h:151
aba_stamp get_aba_stamp() const
Definition: w_markable_pointer.h:176
MarkablePointer & operator=(const MarkablePointer< T > &other)
Definition: w_markable_pointer.h:142
Header file for lintel::Atomic class.
uint16_t aba_stamp
Definition: w_markable_pointer.h:45
uint64_t as_int() const
Definition: w_markable_pointer.h:207
static uintptr_t combine(T *ptr, bool mark, aba_stamp stamp)
Definition: w_markable_pointer.h:245
MarkablePointer(const MarkablePointer< T > &other)
Definition: w_markable_pointer.h:137
static const uint64_t STAMP_MASK
Definition: w_markable_pointer.h:127
MarkablePointer atomic_swap(const MarkablePointer &new_ptr)
[Atomic] Swap pointer, mark, and stamp altogether.
Definition: w_markable_pointer.h:326
MarkablePointerChain(const MarkablePointerChain &other)
Definition: w_markable_pointer.h:295
static const uint64_t POINTER_MASK
Definition: w_markable_pointer.h:121
bool is_marked() const
Definition: w_markable_pointer.h:171
void increase_aba_stamp()
Definition: w_markable_pointer.h:187
void set_aba_stamp(aba_stamp stamp)
Definition: w_markable_pointer.h:181
uintptr_t _pointer
Definition: w_markable_pointer.h:263
bool is_null() const
Definition: w_markable_pointer.h:202
Bit-stealing Atomic Markable Pointer.
Definition: w_markable_pointer.h:115
void set_mark(bool on)
Definition: w_markable_pointer.h:166
MarkablePointerChain()
Definition: w_markable_pointer.h:293
MarkablePointer(T *pointer, bool mark, aba_stamp stamp=0)
Definition: w_markable_pointer.h:133
T * get_pointer() const
Definition: w_markable_pointer.h:192
MarkablePointer< NEXT > next
Definition: w_markable_pointer.h:304
MarkablePointerChain & operator=(const MarkablePointerChain &other)
Definition: w_markable_pointer.h:298
#define T
Definition: w_okvl_inl.h:45
MarkablePointer()
Definition: w_markable_pointer.h:130
static T * cast_to_ptr(uintptr_t ptr)
Definition: w_markable_pointer.h:257
T * operator->() const
Definition: w_markable_pointer.h:197
Atomic Markable Pointer Chain for lock-free list/queue/etc.
Definition: w_markable_pointer.h:292
static const uint64_t STAMP_SHIFT
Definition: w_markable_pointer.h:124
bool atomic_cas(T *expected_pointer, T *new_pointer, bool expected_mark, bool new_mark, aba_stamp expected_stamp, aba_stamp new_stamp)
[Atomic] Compare and set for both pointer and mark (stashed value). See Figure 9.23 of [HERLIHY] ...
Definition: w_markable_pointer.h:308
static const uint64_t MARK_BIT
Definition: w_markable_pointer.h:118