86 #define MCS_EXT_QNODE_INITIALIZER {{NULL,false},NULL} 87 #define MCS_EXT_QNODE_INITIALIZE(x) \ 88 { (x)._node._next = NULL; (x)._node._waiting = 0; (x)._node._delegated = 0; (x)._held = NULL; } 104 if (attempt((
qnode*)me)) {
115 qnode* null_cas_tmp =
nullptr;
116 if (!lintel::unsafe::atomic_compare_exchange_strong<qnode*>(
117 &_tail, &null_cas_tmp, (
qnode*)me)) {
127 return acquire((
qnode*)me);
131 return __unsafe_end_acquire(me, __unsafe_begin_acquire(me));
137 qnode* pred = lintel::unsafe::atomic_exchange<qnode*>(&_tail, me);
182 if (!(next = me->
_next)) {
183 qnode* me_cas_tmp = me;
185 lintel::unsafe::atomic_compare_exchange_strong<qnode*>(&_tail, &me_cas_tmp, (
qnode*)
nullptr)) {
188 next = spin_on_next(me);
195 return me->
_held ==
this;
202 #endif // __MCS_LOCK_H void atomic_thread_fence(memory_order order)
Definition: AtomicCounter.hpp:223
void * acquire(qnode *me)
Definition: mcs_lock.h:130
void release(qnode *me)
Definition: mcs_lock.h:178
const qnode_status QNODE_IDLE
Definition: mcs_lock.h:42
#define w_assert1(x)
Level 1 should not add significant extra time.
Definition: w_base.h:198
qnode * _tail
Definition: mcs_lock.h:90
void release(ext_qnode *me)
Definition: mcs_lock.h:163
qnode volatile * vthis()
Definition: mcs_lock.h:71
Header file for lintel::Atomic class.
qnode * _next
Definition: mcs_lock.h:65
qnode * __unsafe_begin_acquire(qnode *me)
Definition: mcs_lock.h:134
int32_t _delegated
Definition: mcs_lock.h:37
void * acquire(ext_qnode *me)
Definition: mcs_lock.h:125
bool attempt(qnode *me)
Definition: mcs_lock.h:111
void * __unsafe_end_acquire(qnode *me, qnode *pred)
Definition: mcs_lock.h:144
bool attempt(ext_qnode *me)
Definition: mcs_lock.h:103
const qnode_status QNODE_DELEGATED
Definition: mcs_lock.h:46
const size_t CACHELINE_MCS_PADDING
Definition: mcs_lock.h:200
bool is_mine(ext_qnode *me)
Definition: mcs_lock.h:194
void spin_on_waiting(qnode *me)
Definition: mcs_lock.h:97
qnode * spin_on_next(qnode *me)
Definition: mcs_lock.h:157
An MCS queuing spinlock.
Definition: mcs_lock.h:61
void release(qnode &me)
Definition: mcs_lock.h:174
mcs_lock()
Definition: mcs_lock.h:92
Definition: AtomicCounter.hpp:114
void release(ext_qnode &me)
Definition: mcs_lock.h:169
Definition: mcs_lock.h:64
const qnode_status QNODE_WAITING
Definition: mcs_lock.h:44
int64_t _combined
Definition: mcs_lock.h:39
mcs_lock * _held
Definition: mcs_lock.h:79
struct qnode_status::@8 individual
Definition: mcs_lock.h:34
int32_t _waiting
Definition: mcs_lock.h:36
qnode _node
Definition: mcs_lock.h:77
qnode_status _status
Definition: mcs_lock.h:67
Definition: mcs_lock.h:76
Definition: AtomicCounter.hpp:113
const size_t CACHELINE_SIZE
CPU Cache line size in bytes.
Definition: w_defines.h:183