class Garcon::CopyOnWriteObserverSet

A thread safe observer set implemented using copy-on-write approach: every time an observer is added or removed the whole internal data structure is duplicated and replaced with a new one.

Public Class Methods

new() click to toggle source
# File lib/garcon/task/copy_on_write_observer_set.rb, line 28
def initialize
  @mutex = Mutex.new
  @observers = {}
end

Public Instance Methods

add_observer(observer=nil, func=:update, &block) click to toggle source

Adds an observer to this set. If a block is passed, the observer will be created by this method and no other params should be passed

@param [Object] observer

the observer to add

@param [Symbol] func

the function to call on the observer during notification. The default
is :update.

@return [Object]

the added observer
# File lib/garcon/task/copy_on_write_observer_set.rb, line 45
def add_observer(observer=nil, func=:update, &block)
  if observer.nil? && block.nil?
    raise ArgumentError, 'should pass observer as a first argument or block'
  elsif observer && block
    raise ArgumentError.new('cannot provide both an observer and a block')
  end

  if block
    observer = block
    func = :call
  end

  begin
    @mutex.lock
    new_observers = @observers.dup
    new_observers[observer] = func
    @observers = new_observers
    observer
  ensure
    @mutex.unlock
  end
end
count_observers() click to toggle source

@return [Integer] the observers count

# File lib/garcon/task/copy_on_write_observer_set.rb, line 91
def count_observers
  observers.count
end
delete_observer(observer) click to toggle source

@param [Object] observer

the observer to remove

@return [Object]

the deleted observer
# File lib/garcon/task/copy_on_write_observer_set.rb, line 72
def delete_observer(observer)
  @mutex.lock
  new_observers = @observers.dup
  new_observers.delete(observer)
  @observers = new_observers
  observer
ensure
  @mutex.unlock
end
delete_observers() click to toggle source

Deletes all observers @return [CopyOnWriteObserverSet] self

# File lib/garcon/task/copy_on_write_observer_set.rb, line 84
def delete_observers
  self.observers = {}
  self
end
notify_and_delete_observers(*args, &block) click to toggle source

Notifies all registered observers with optional args and deletes them.

@param [Object] args

Arguments to be passed to each observer

@return [CopyOnWriteObserverSet] self

# File lib/garcon/task/copy_on_write_observer_set.rb, line 112
def notify_and_delete_observers(*args, &block)
  old = clear_observers_and_return_old
  notify_to(old, *args, &block)
  self
end
notify_observers(*args, &block) click to toggle source

Notifies all registered observers with optional args

@param [Object] args

Arguments to be passed to each observer

@return [CopyOnWriteObserverSet] self

# File lib/garcon/task/copy_on_write_observer_set.rb, line 101
def notify_observers(*args, &block)
  notify_to(observers, *args, &block)
  self
end