Module: ThreadSafe::Util::Volatile

### Home Classes Methods

### In Files

- lib/thread_safe/util/volatile.rb

### Methods

- #attr_volatile

### Included Modules

- Module

### Class/Module Index

Quicksearch

- ThreadSafe
- ThreadSafe::Array
- ThreadSafe::AtomicReferenceCacheBackend
- ThreadSafe::AtomicReferenceCacheBackend::Node
- ThreadSafe::AtomicReferenceCacheBackend::Table
- ThreadSafe::Cache
- ThreadSafe::Hash
- ThreadSafe::MriCacheBackend
- ThreadSafe::NonConcurrentCacheBackend
- ThreadSafe::SynchronizedCacheBackend
- ThreadSafe::Util
- ThreadSafe::Util::Adder
- ThreadSafe::Util::CheapLockable
- ThreadSafe::Util::PowerOfTwoTuple
- ThreadSafe::Util::Striped64
- ThreadSafe::Util::Striped64::Cell
- ThreadSafe::Util::Volatile
- ThreadSafe::Util::VolatileTuple
- SynchronizedDelegator
- Threadsafe

No matching classes.

# 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 23
    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.