aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/notifications/fanout.rb
diff options
context:
space:
mode:
authorCarlhuda <carlhuda@engineyard.com>2010-03-01 17:33:59 -0800
committerCarlhuda <carlhuda@engineyard.com>2010-03-01 17:45:37 -0800
commitfc0882ba5a0f18281736859718252042b15614ad (patch)
tree959bd861403369fc2d615104a102663a9b9a8da2 /activesupport/lib/active_support/notifications/fanout.rb
parentc88360ef3651702ca8f7f600e15774f51c84698b (diff)
downloadrails-fc0882ba5a0f18281736859718252042b15614ad.tar.gz
rails-fc0882ba5a0f18281736859718252042b15614ad.tar.bz2
rails-fc0882ba5a0f18281736859718252042b15614ad.zip
Optimize AS::Notifications to remember which subscribers don't match and not run them. This will allow notifications that are only useful in dev or testing to run efficiently in production.
Diffstat (limited to 'activesupport/lib/active_support/notifications/fanout.rb')
-rw-r--r--activesupport/lib/active_support/notifications/fanout.rb15
1 files changed, 12 insertions, 3 deletions
diff --git a/activesupport/lib/active_support/notifications/fanout.rb b/activesupport/lib/active_support/notifications/fanout.rb
index e08011e23f..cd60054862 100644
--- a/activesupport/lib/active_support/notifications/fanout.rb
+++ b/activesupport/lib/active_support/notifications/fanout.rb
@@ -5,6 +5,7 @@ module ActiveSupport
class Fanout
def initialize
@subscribers = []
+ @listeners_for = {}
end
def bind(pattern)
@@ -12,16 +13,22 @@ module ActiveSupport
end
def subscribe(pattern = nil, &block)
+ @listeners_for.clear
@subscribers << Subscriber.new(pattern, &block)
@subscribers.last
end
def unsubscribe(subscriber)
@subscribers.delete(subscriber)
+ @listeners_for.clear
end
- def publish(*args)
- @subscribers.each { |s| s.publish(*args) }
+ def publish(name, *args)
+ if listeners = @listeners_for[name]
+ listeners.each { |s| s.publish(name, *args) }
+ else
+ @listeners_for[name] = @subscribers.select { |s| s.publish(name, *args) }
+ end
end
# This is a sync queue, so there is not waiting.
@@ -53,7 +60,9 @@ module ActiveSupport
end
def publish(*args)
- push(*args) if matches?(args.first)
+ return unless matches?(args.first)
+ push(*args)
+ true
end
def drained?