Created
January 29, 2009 05:30
-
-
Save headius/54401 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/activesupport/lib/active_support/dependencies.rb b/activesupport/lib/active_support/dependencies.rb | |
index 7ce9ade..2badad5 100644 | |
--- a/activesupport/lib/active_support/dependencies.rb | |
+++ b/activesupport/lib/active_support/dependencies.rb | |
@@ -51,6 +51,9 @@ module ActiveSupport #:nodoc: | |
mattr_accessor :constant_watch_stack | |
self.constant_watch_stack = [] | |
+ mattr_accessor :constant_watch_stack_mutex | |
+ self.constant_watch_stack_mutex = Mutex.new | |
+ | |
# Module includes this module | |
module ModuleConstMissing #:nodoc: | |
def self.included(base) #:nodoc: | |
@@ -509,7 +512,9 @@ module ActiveSupport #:nodoc: | |
[mod_name, initial_constants] | |
end | |
- constant_watch_stack.concat watch_frames | |
+ constant_watch_stack_mutex.synchronize do | |
+ constant_watch_stack.concat watch_frames | |
+ end | |
aborting = true | |
begin | |
@@ -526,8 +531,10 @@ module ActiveSupport #:nodoc: | |
new_constants = mod.local_constant_names - prior_constants | |
# Make sure no other frames takes credit for these constants. | |
- constant_watch_stack.each do |frame_name, constants| | |
- constants.concat new_constants if frame_name == mod_name | |
+ constant_watch_stack_mutex.synchronize do | |
+ constant_watch_stack.each do |frame_name, constants| | |
+ constants.concat new_constants if frame_name == mod_name | |
+ end | |
end | |
new_constants.collect do |suffix| | |
@@ -549,8 +556,10 @@ module ActiveSupport #:nodoc: | |
# Remove the stack frames that we added. | |
if defined?(watch_frames) && ! watch_frames.blank? | |
frame_ids = watch_frames.collect { |frame| frame.object_id } | |
- constant_watch_stack.delete_if do |watch_frame| | |
- frame_ids.include? watch_frame.object_id | |
+ constant_watch_stack_mutex.synchronize do | |
+ constant_watch_stack.delete_if do |watch_frame| | |
+ frame_ids.include? watch_frame.object_id | |
+ end | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment