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