class ThreadSafe::AtomicReferenceCacheBackend::Node
def try_await_lock(table, i)
CAS from non-waiting +LOCKED+ state), unlockers acquire the
detecting that +WAITING+ has been set when unlocking lock (via a failed
The corresponding signalling operation is performed within callers: Upon
available upon exit, which enables these simple single-wait mechanics.
still set. It is OK for this method to return even if lock is not
and then sets +WAITING+ bits on hash field and blocks (once) if they are
Spins a while if +LOCKED+ bit set and this node is the first of its bin,
def try_await_lock(table, i) if table && i >= 0 && i < table.size # bounds check, TODO: why are we bounds checking? spins = SPIN_LOCK_ATTEMPTS randomizer = base_randomizer = Util::XorShiftRandom.get while equal?(table.volatile_get(i)) && self.class.locked_hash?(my_hash = hash) if spins >= 0 if (randomizer = (randomizer >> 1)).even? # spin at random if (spins -= 1) == 0 Thread.pass # yield before blocking else randomizer = base_randomizer = Util::XorShiftRandom.xorshift(base_randomizer) if randomizer.zero? end end elsif cas_hash(my_hash, my_hash | WAITING) force_aquire_lock(table, i) break end end end end