module Contender::CopyOnWriteStructure

@abstract

Public Class Methods

included(receiver) click to toggle source
# File lib/contender/copy_on_write_structure.rb, line 6
def self.included(receiver)
  receiver.send :extend, ClassMethods
  receiver.send :extend, Forwardable
end
new(*args, &block) click to toggle source
# File lib/contender/copy_on_write_structure.rb, line 59
def initialize(*args, &block)
  @reference = Atomic.new(self.class.delegated_type.new(*args, &block))
end

Protected Instance Methods

current_reference() click to toggle source

@return [Object]

# File lib/contender/copy_on_write_structure.rb, line 66
def current_reference
  @reference.value
end
update_reference() { |update| ... } click to toggle source

@yield [Object] @return [Object]

# File lib/contender/copy_on_write_structure.rb, line 72
def update_reference
  loop do
    current = current_reference
    update = current.clone

    result = yield update

    if result.equal? update
      # Most write operations return a reference to self
      # Don't let this reference leak to the caller
      result = self
    end

    return result if @reference.compare_and_swap current, update

    # Concurrent modification, retry operation
  end
end