lib/active_support/dependencies.rb in activesupport-2.2.3 vs lib/active_support/dependencies.rb in activesupport-2.3.2

- old
+ new

@@ -49,10 +49,13 @@ # An internal stack used to record which constants are loaded by any block. 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: base.class_eval do unless defined? const_missing_without_dependencies @@ -317,16 +320,11 @@ begin qualified_const_defined?(nesting_camel) rescue NameError next end - - [ - nesting.camelize, - # Special case: application.rb might define ApplicationControlller. - ('ApplicationController' if nesting == 'application') - ] + [ nesting_camel ] end.flatten.compact.uniq end # Search for a file in load_paths matching the provided suffix. def search_for_file(path_suffix) @@ -512,11 +510,13 @@ end [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 yield # Now yield to the code that is to define new constants. aborting = false @@ -529,12 +529,14 @@ mod = mod_name.constantize next [] unless mod.is_a? Module 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| mod_name == "Object" ? suffix : "#{mod_name}::#{suffix}" end @@ -552,22 +554,24 @@ return new_constants ensure # 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 class LoadingModule #:nodoc: # Old style environment.rb referenced this method directly. Please note, it doesn't # actually *do* anything any more. def self.root(*args) - if defined?(RAILS_DEFAULT_LOGGER) - RAILS_DEFAULT_LOGGER.warn "Your environment.rb uses the old syntax, it may not continue to work in future releases." - RAILS_DEFAULT_LOGGER.warn "For upgrade instructions please see: http://manuals.rubyonrails.com/read/book/19" + if defined?(Rails) && Rails.logger + Rails.logger.warn "Your environment.rb uses the old syntax, it may not continue to work in future releases." + Rails.logger.warn "For upgrade instructions please see: http://manuals.rubyonrails.com/read/book/19" end end end # Convert the provided const desc to a qualified constant name (as a string).