diff options
author | Carlhuda <carlhuda@engineyard.com> | 2010-07-21 16:29:26 -0700 |
---|---|---|
committer | Carlhuda <carlhuda@engineyard.com> | 2010-07-22 11:36:16 -0700 |
commit | ba8d89c4c8d1c038c0d6fc9dbfe22f6d528d0da9 (patch) | |
tree | b8d1df3420ccef896537f1d74f2022569dfa3bcf /activesupport/lib/active_support/notifications.rb | |
parent | 97f3c7387e22c7752310a6b9c74ddb9fd3a8eb2d (diff) | |
download | rails-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.rb | 24 |
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 |