aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/notifications
diff options
context:
space:
mode:
authorCarlhuda <carlhuda@engineyard.com>2010-07-21 16:29:26 -0700
committerCarlhuda <carlhuda@engineyard.com>2010-07-22 11:36:16 -0700
commitba8d89c4c8d1c038c0d6fc9dbfe22f6d528d0da9 (patch)
treeb8d1df3420ccef896537f1d74f2022569dfa3bcf /activesupport/lib/active_support/notifications
parent97f3c7387e22c7752310a6b9c74ddb9fd3a8eb2d (diff)
downloadrails-ba8d89c4c8d1c038c0d6fc9dbfe22f6d528d0da9.tar.gz
rails-ba8d89c4c8d1c038c0d6fc9dbfe22f6d528d0da9.tar.bz2
rails-ba8d89c4c8d1c038c0d6fc9dbfe22f6d528d0da9.zip
Performance optimizations to handle cases of instrumentors that are not listened to. Also, fix a possible concurrency issue.
Diffstat (limited to 'activesupport/lib/active_support/notifications')
-rw-r--r--activesupport/lib/active_support/notifications/fanout.rb11
-rw-r--r--activesupport/lib/active_support/notifications/instrumenter.rb2
2 files changed, 9 insertions, 4 deletions
diff --git a/activesupport/lib/active_support/notifications/fanout.rb b/activesupport/lib/active_support/notifications/fanout.rb
index 64f315cb6a..adc34f3286 100644
--- a/activesupport/lib/active_support/notifications/fanout.rb
+++ b/activesupport/lib/active_support/notifications/fanout.rb
@@ -9,15 +9,16 @@ module ActiveSupport
end
def subscribe(pattern = nil, block = Proc.new)
- @listeners_for.clear
- Subscriber.new(pattern, block).tap do |s|
+ subscriber = Subscriber.new(pattern, block).tap do |s|
@subscribers << s
end
+ @listeners_for.clear
+ subscriber
end
def unsubscribe(subscriber)
- @listeners_for.clear
@subscribers.reject! {|s| s.matches?(subscriber)}
+ @listeners_for.clear
end
def publish(name, *args)
@@ -28,6 +29,10 @@ module ActiveSupport
@listeners_for[name] ||= @subscribers.select { |s| s.subscribed_to?(name) }
end
+ def listening?(name)
+ listeners_for(name).any?
+ end
+
# This is a sync queue, so there is not waiting.
def wait
end
diff --git a/activesupport/lib/active_support/notifications/instrumenter.rb b/activesupport/lib/active_support/notifications/instrumenter.rb
index e98189f899..713d5a5f25 100644
--- a/activesupport/lib/active_support/notifications/instrumenter.rb
+++ b/activesupport/lib/active_support/notifications/instrumenter.rb
@@ -19,7 +19,7 @@ module ActiveSupport
def instrument(name, payload={})
begin
@started = Time.now
- yield(payload) if block_given?
+ yield
rescue Exception => e
payload[:exception] = [e.class.name, e.message]
raise e