Methods

Included Modules

ThreadSafe::Util::Volatile

Public Instance Methods

attr_volatile(*attr_names) click to toggle source

Provides volatile (in the JVM’s sense) attribute accessors implemented atop of the +AtomicReference+s. Usage:

class Foo
  extend ThreadSafe::Util::Volatile
  attr_volatile :foo, :bar

  def initialize(bar)
    super() # must super() into parent initializers before using the volatile attribute accessors
    self.bar = bar
  end

  def hello
    my_foo = foo # volatile read
    self.foo = 1 # volatile write
    cas_foo(1, 2) # => true | a strong CAS
  end
end
# File lib/thread_safe/util/volatile.rb, line 21
def attr_volatile(*attr_names)
  return if attr_names.empty?
  include(Module.new do
    atomic_ref_setup = attr_names.map {|attr_name| "@__#{attr_name} = ThreadSafe::Util::AtomicReference.new"}
    initialize_copy_setup = attr_names.zip(atomic_ref_setup).map do |attr_name, ref_setup|
      "#{ref_setup}(other.instance_variable_get(:@__#{attr_name}).get)"
    end
    class_eval             def initialize(*)              super              #{atomic_ref_setup.join('; ')}            end            def initialize_copy(other)              super              #{initialize_copy_setup.join('; ')}            end, __FILE__, __LINE__ + 1

    attr_names.each do |attr_name|
      class_eval               def #{attr_name}                @__#{attr_name}.get              end              def #{attr_name}=(value)                @__#{attr_name}.set(value)              end              def compare_and_set_#{attr_name}(old_value, new_value)                @__#{attr_name}.compare_and_set(old_value, new_value)              end, __FILE__, __LINE__ + 1

      alias_method :"cas_#{attr_name}", :"compare_and_set_#{attr_name}"
      alias_method :"lazy_set_#{attr_name}", :"#{attr_name}="
    end
  end

[Validate]

Generated with the Darkfish Rdoc Generator 2.