Class: Concurrent::CopyOnWriteObserverSet
- Inherits:
-
Object
- Object
- Concurrent::CopyOnWriteObserverSet
- Defined in:
- lib/concurrent/atomic/copy_on_write_observer_set.rb
Overview
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.
Instance Method Summary collapse
-
#add_observer(observer = nil, func = :update, &block) ⇒ Object
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.
-
#count_observers ⇒ Integer
The observers count.
-
#delete_observer(observer) ⇒ Object
The deleted observer.
-
#delete_observers ⇒ CopyOnWriteObserverSet
Deletes all observers.
-
#initialize ⇒ CopyOnWriteObserverSet
constructor
A new instance of CopyOnWriteObserverSet.
-
#notify_and_delete_observers(*args, &block) ⇒ CopyOnWriteObserverSet
Notifies all registered observers with optional args and deletes them.
-
#notify_observers(*args, &block) ⇒ CopyOnWriteObserverSet
Notifies all registered observers with optional args.
Constructor Details
#initialize ⇒ CopyOnWriteObserverSet
Returns a new instance of CopyOnWriteObserverSet.
8 9 10 11 |
# File 'lib/concurrent/atomic/copy_on_write_observer_set.rb', line 8 def initialize @mutex = Mutex.new @observers = {} end |
Instance Method Details
#add_observer(observer = nil, func = :update, &block) ⇒ Object
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
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/concurrent/atomic/copy_on_write_observer_set.rb', line 18 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 ⇒ Integer
Returns the observers count.
62 63 64 |
# File 'lib/concurrent/atomic/copy_on_write_observer_set.rb', line 62 def count_observers observers.count end |
#delete_observer(observer) ⇒ Object
Returns the deleted observer.
43 44 45 46 47 48 49 50 51 |
# File 'lib/concurrent/atomic/copy_on_write_observer_set.rb', line 43 def delete_observer(observer) @mutex.lock new_observers = @observers.dup new_observers.delete(observer) @observers = new_observers observer ensure @mutex.unlock end |
#delete_observers ⇒ CopyOnWriteObserverSet
Deletes all observers
55 56 57 58 |
# File 'lib/concurrent/atomic/copy_on_write_observer_set.rb', line 55 def delete_observers self.observers = {} self end |
#notify_and_delete_observers(*args, &block) ⇒ CopyOnWriteObserverSet
Notifies all registered observers with optional args and deletes them.
78 79 80 81 82 |
# File 'lib/concurrent/atomic/copy_on_write_observer_set.rb', line 78 def notify_and_delete_observers(*args, &block) old = clear_observers_and_return_old notify_to(old, *args, &block) self end |
#notify_observers(*args, &block) ⇒ CopyOnWriteObserverSet
Notifies all registered observers with optional args
69 70 71 72 |
# File 'lib/concurrent/atomic/copy_on_write_observer_set.rb', line 69 def notify_observers(*args, &block) notify_to(observers, *args, &block) self end |