aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/notifications.rb
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.rb
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.rb')
-rw-r--r--activesupport/lib/active_support/notifications.rb24
1 files changed, 22 insertions, 2 deletions
diff --git a/activesupport/lib/active_support/notifications.rb b/activesupport/lib/active_support/notifications.rb
index 93d1907edc..886d7183eb 100644
--- a/activesupport/lib/active_support/notifications.rb
+++ b/activesupport/lib/active_support/notifications.rb
@@ -41,10 +41,30 @@ module ActiveSupport
autoload :Event, 'active_support/notifications/instrumenter'
autoload :Fanout, 'active_support/notifications/fanout'
+ @instrumenters = Hash.new { |h,k| h[k] = notifier.listening?(k) }
+
class << self
attr_writer :notifier
- delegate :publish, :subscribe, :unsubscribe, :to => :notifier
- delegate :instrument, :to => :instrumenter
+ delegate :publish, :unsubscribe, :to => :notifier
+
+ def instrument(name, payload = {})
+ if @instrumenters[name]
+ instrumenter.instrument(name, payload) { yield payload if block_given? }
+ else
+ yield payload if block_given?
+ end
+ end
+
+ def subscribe(*args, &block)
+ notifier.subscribe(*args, &block).tap do
+ @instrumenters.clear
+ end
+ end
+
+ def unsubscribe(*args)
+ notifier.unsubscribe(*args)
+ @instrumenters.clear
+ end
def notifier
@notifier ||= Fanout.new