Object
Key-value entry. Nodes with a hash field of MOVED are special, and do not contain user keys or values. Otherwise, keys are never nil, and NULL value fields indicate that a node is in the process of being deleted or created. For purposes of read-only access, a key may be read before a value, but can only be used after checking value to be +!= NULL+.
# File lib/thread_safe/atomic_reference_cache_backend.rb, line 294 def key?(key) @key.eql?(key) end
# File lib/thread_safe/atomic_reference_cache_backend.rb, line 316 def locked? self.class.locked_hash?(hash) end
# File lib/thread_safe/atomic_reference_cache_backend.rb, line 298 def matches?(key, hash) pure_hash == hash && key?(key) end
# File lib/thread_safe/atomic_reference_cache_backend.rb, line 302 def pure_hash hash & HASH_BITS end
Spins a while if LOCKED bit set and this node is the first of its bin, and then sets WAITING bits on hash field and blocks (once) if they are still set. It is OK for this method to return even if lock is not available upon exit, which enables these simple single-wait mechanics.
The corresponding signalling operation is performed within callers: Upon detecting that WAITING has been set when unlocking lock (via a failed CAS from non-waiting LOCKED state), unlockers acquire the cheap_synchronize lock and perform a cheap_broadcast.
# File lib/thread_safe/atomic_reference_cache_backend.rb, line 273 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
Generated with the Darkfish Rdoc Generator 2.