aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Draper <matthew@trebex.net>2016-03-04 00:34:29 +1030
committerMatthew Draper <matthew@trebex.net>2016-03-04 00:35:43 +1030
commitf0528a544c1dbb610574123efc59fe272610cae4 (patch)
treed69557eace0aa7a5c89e725b0b0f4ab7978e3515
parent2c53e27992500ab0e68db18ea71ad58f6c845edb (diff)
downloadrails-f0528a544c1dbb610574123efc59fe272610cae4.tar.gz
rails-f0528a544c1dbb610574123efc59fe272610cae4.tar.bz2
rails-f0528a544c1dbb610574123efc59fe272610cae4.zip
Prevent nested ExecutionWrapper calls even when using run! directly
-rw-r--r--activesupport/lib/active_support/execution_wrapper.rb21
-rw-r--r--activesupport/lib/active_support/reloader.rb4
2 files changed, 16 insertions, 9 deletions
diff --git a/activesupport/lib/active_support/execution_wrapper.rb b/activesupport/lib/active_support/execution_wrapper.rb
index e784556abf..2bd1c01d35 100644
--- a/activesupport/lib/active_support/execution_wrapper.rb
+++ b/activesupport/lib/active_support/execution_wrapper.rb
@@ -4,6 +4,10 @@ module ActiveSupport
class ExecutionWrapper
include ActiveSupport::Callbacks
+ Null = Object.new # :nodoc:
+ def Null.complete! # :nodoc:
+ end
+
define_callbacks :run
define_callbacks :complete
@@ -22,7 +26,11 @@ module ActiveSupport
#
# Where possible, prefer +wrap+.
def self.run!
- new.tap(&:run!)
+ if active?
+ Null
+ else
+ new.tap(&:run!)
+ end
end
# Perform the work in the supplied block as an execution.
@@ -43,17 +51,17 @@ module ActiveSupport
def self.inherited(other) # :nodoc:
super
- other.active = Concurrent::Hash.new(0)
+ other.active = Concurrent::Hash.new
end
- self.active = Concurrent::Hash.new(0)
+ self.active = Concurrent::Hash.new
def self.active? # :nodoc:
- @active[Thread.current] > 0
+ @active[Thread.current]
end
def run! # :nodoc:
- self.class.active[Thread.current] += 1
+ self.class.active[Thread.current] = true
run_callbacks(:run)
end
@@ -63,7 +71,8 @@ module ActiveSupport
# Where possible, prefer +wrap+.
def complete!
run_callbacks(:complete)
- self.class.active.delete Thread.current if (self.class.active[Thread.current] -= 1) == 0
+ ensure
+ self.class.active.delete Thread.current
end
end
end
diff --git a/activesupport/lib/active_support/reloader.rb b/activesupport/lib/active_support/reloader.rb
index d88fcbcf78..5d1f0e1e66 100644
--- a/activesupport/lib/active_support/reloader.rb
+++ b/activesupport/lib/active_support/reloader.rb
@@ -22,8 +22,6 @@ module ActiveSupport
# unloaded.
#
class Reloader < ExecutionWrapper
- Null = Class.new(ExecutionWrapper) # :nodoc:
-
define_callbacks :prepare
define_callbacks :class_unload
@@ -54,7 +52,7 @@ module ActiveSupport
if check!
super
else
- Null.run!
+ Null
end
end