mirror of
https://github.com/github/rails.git
synced 2026-04-26 03:00:59 -04:00
Ensure constant_watch_stack is protected by a mutex, so concurrent requires do not corrupt it.
[#1816 state:committed] Signed-off-by: Jeremy Kemper <jeremy@bitsweat.net>
This commit is contained in:
committed by
Jeremy Kemper
parent
2dedb5b03a
commit
ed0e564087
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user