11 #ifndef BOOST_LOCKFREE_TAGGED_PTR_PTRCOMPRESSION_HPP_INCLUDED
12 #define BOOST_LOCKFREE_TAGGED_PTR_PTRCOMPRESSION_HPP_INCLUDED
14 #include <boost/lockfree/detail/cas.hpp>
15 #include <boost/lockfree/detail/branch_hints.hpp>
19 #include <boost/cstdint.hpp>
26 #if defined (__x86_64__) || defined (_M_X64)
29 class BOOST_LOCKFREE_DCAS_ALIGNMENT tagged_ptr
31 typedef boost::uint64_t compressed_ptr_t;
32 typedef boost::uint16_t tag_t;
37 compressed_ptr_t value;
41 static const int tag_index = 3;
42 static const compressed_ptr_t ptr_mask = 0xffffffffffff;
44 static T* extract_ptr(compressed_ptr_t
const & i)
46 return (T*)(i & ptr_mask);
49 static tag_t extract_tag(compressed_ptr_t
const & i)
53 return cu.tag[tag_index];
56 static compressed_ptr_t pack_ptr(T * ptr,
int tag)
59 ret.value = compressed_ptr_t(ptr);
60 ret.tag[tag_index] = tag;
65 static const bool is_lockfree = boost::lockfree::atomic_cas<compressed_ptr_t>::is_lockfree;
72 tagged_ptr(tagged_ptr
const & p)
77 explicit tagged_ptr(T * p, tag_t t = 0):
83 void operator= (tagged_ptr
const & p)
88 void atomic_set(tagged_ptr
const & p)
93 void atomic_set(T * p, tag_t t)
101 void set(tagged_ptr
const & p)
106 void set(T * p, tag_t t)
108 ptr = pack_ptr(p, t);
114 bool operator== (tagged_ptr
const & p)
const
116 return (ptr == p.ptr);
119 bool operator!= (tagged_ptr
const & p)
const
121 return !operator==(p);
129 return extract_ptr(ptr);
134 tag_t tag = get_tag();
135 ptr = pack_ptr(p, tag);
141 tag_t get_tag()
const
143 return extract_tag(ptr);
146 void set_tag(tag_t t)
149 ptr = pack_ptr(p, t);
156 bool cas(compressed_ptr_t
const & oldval, compressed_ptr_t
const & newval)
158 return boost::lockfree::atomic_cas<compressed_ptr_t>::cas(&(this->ptr), oldval, newval);
162 bool cas(tagged_ptr
const & oldval, T * newptr)
164 compressed_ptr_t new_compressed_ptr = pack_ptr(newptr, extract_tag(oldval.ptr)+1);
165 return cas(oldval.ptr, new_compressed_ptr);
168 bool cas(tagged_ptr
const & oldval, T * newptr, tag_t t)
170 compressed_ptr_t new_compressed_ptr = pack_ptr(newptr, t);
171 return boost::lockfree::atomic_cas<compressed_ptr_t>::cas(&(this->ptr), oldval.ptr, new_compressed_ptr);
177 T & operator*()
const
182 T * operator->()
const
187 operator bool(
void)
const
189 return get_ptr() != 0;
194 compressed_ptr_t ptr;
197 #error unsupported platform