@@ -16,34 +16,49 @@ def initialize
1616 # @param [Symbol] func the function to call on the observer during notification. Default is :update
1717 # @return [Symbol] the added function
1818 def add_observer ( observer , func = :update )
19- @mutex . synchronize { @observers [ observer ] = func }
19+ @mutex . lock
20+ @observers [ observer ] = func
21+ @mutex . unlock
22+
23+ func
2024 end
25+
2126 alias_method :add_watch , :add_observer
2227
2328 # @param [Object] observer the observer to remove
2429 # @return [Object] the deleted observer
2530 def delete_observer ( observer )
26- @mutex . synchronize { @observers . delete ( observer ) }
31+ @mutex . lock
32+ @observers . delete ( observer )
33+ @mutex . unlock
34+
2735 observer
2836 end
2937
3038 # Deletes all observers
3139 # @return [CopyOnWriteObserverSet] self
3240 def delete_observers
33- @mutex . synchronize { @observers . clear }
41+ @mutex . lock
42+ @observers . clear
43+ @mutex . unlock
44+
3445 self
3546 end
3647
3748 # @return [Integer] the observers count
3849 def count_observers
39- @mutex . synchronize { @observers . count }
50+ @mutex . lock
51+ result = @observers . count
52+ @mutex . unlock
53+
54+ result
4055 end
4156
4257 # Notifies all registered observers with optional args
4358 # @param [Object] args arguments to be passed to each observer
4459 # @return [CopyOnWriteObserverSet] self
4560 def notify_observers ( *args , &block )
46- observers = @mutex . synchronize { @observers . dup }
61+ observers = duplicate_observers
4762 notify_to ( observers , *args , &block )
4863
4964 self
@@ -63,15 +78,24 @@ def notify_and_delete_observers(*args, &block)
6378 private
6479
6580 def duplicate_and_clear_observers
66- @mutex . synchronize do
67- observers = @observers . dup
68- @observers . clear
69- observers
70- end
81+ @mutex . lock
82+ observers = @observers . dup
83+ @observers . clear
84+ @mutex . unlock
85+
86+ observers
87+ end
88+
89+ def duplicate_observers
90+ @mutex . lock
91+ observers = @observers . dup
92+ @mutex . unlock
93+
94+ observers
7195 end
7296
7397 def notify_to ( observers , *args )
74- raise ArgumentError . new ( 'cannot give arguments and a block' ) if block_given? && ! args . empty?
98+ raise ArgumentError . new ( 'cannot give arguments and a block' ) if block_given? && !args . empty?
7599 observers . each do |observer , function |
76100 args = yield if block_given?
77101 observer . send ( function , *args )
0 commit comments