File: C:/Ruby27-x64/lib/ruby/gems/2.7.0/gems/thread_safe-0.3.6/lib/thread_safe/util/atomic_reference.rb
module ThreadSafe
module Util
AtomicReference =
if defined?(Rubinius::AtomicReference)
# An overhead-less atomic reference.
Rubinius::AtomicReference
else
begin
require 'atomic'
defined?(Atomic::InternalReference) ? Atomic::InternalReference : Atomic
rescue LoadError, NameError
class FullLockingAtomicReference
def initialize(value = nil)
@___mutex = Mutex.new
@___value = value
end
def get
@___mutex.synchronize { @___value }
end
alias_method :value, :get
def set(new_value)
@___mutex.synchronize { @___value = new_value }
end
alias_method :value=, :set
def compare_and_set(old_value, new_value)
return false unless @___mutex.try_lock
begin
return false unless @___value.equal? old_value
@___value = new_value
ensure
@___mutex.unlock
end
true
end
end
FullLockingAtomicReference
end
end
end
end