diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2023-07-19 22:38:27 +0900 |
---|---|---|
committer | git <svn-admin@ruby-lang.org> | 2023-07-25 04:52:54 +0000 |
commit | 1b27e7aa1fbd4c3c9a8640e94b1cd8818f4901d1 (patch) | |
tree | 325a2737cb4f6bbef55ab8fb73246eb9ed235935 | |
parent | f72ddd92be0ea80cfc230c5d972d27f91dd3cb1b (diff) | |
download | ruby-1b27e7aa1fbd4c3c9a8640e94b1cd8818f4901d1.tar.gz |
[rubygems/rubygems] Use `Monitor#synchronize` to ensure to exit
https://github.com/rubygems/rubygems/commit/b424353239
-rw-r--r-- | lib/rubygems/core_ext/kernel_require.rb | 44 |
1 files changed, 12 insertions, 32 deletions
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb index e967dfc016..d030f9d46d 100644 --- a/lib/rubygems/core_ext/kernel_require.rb +++ b/lib/rubygems/core_ext/kernel_require.rb @@ -36,9 +36,7 @@ module Kernel def require(path) # :doc: return gem_original_require(path) unless Gem.discover_gems_on_require - begin - RUBYGEMS_ACTIVATION_MONITOR.enter - + RUBYGEMS_ACTIVATION_MONITOR.synchronize do path = path.to_path if path.respond_to? :to_path if spec = Gem.find_unresolved_default_spec(path) @@ -49,13 +47,8 @@ module Kernel Gem.suffixes.each do |s| $LOAD_PATH[0...load_path_check_index].each do |lp| safe_lp = lp.dup.tap(&Gem::UNTAINT) - begin - if File.symlink? safe_lp # for backward compatibility - next - end - rescue SecurityError - RUBYGEMS_ACTIVATION_MONITOR.exit - raise + if File.symlink? safe_lp # for backward compatibility + next end full_path = File.expand_path(File.join(safe_lp, "#{path}#{s}")) @@ -69,20 +62,15 @@ module Kernel rp end - begin - Kernel.send(:gem, spec.name, Gem::Requirement.default_prerelease) - rescue StandardError - RUBYGEMS_ACTIVATION_MONITOR.exit - raise - end unless resolved_path + Kernel.send(:gem, spec.name, Gem::Requirement.default_prerelease) unless + resolved_path end # If there are no unresolved deps, then we can use just try # normal require handle loading a gem from the rescue below. if Gem::Specification.unresolved_deps.empty? - RUBYGEMS_ACTIVATION_MONITOR.exit - return gem_original_require(path) + next end # If +path+ is for a gem that has already been loaded, don't @@ -92,8 +80,7 @@ module Kernel # TODO request access to the C implementation of this to speed up RubyGems if Gem::Specification.find_active_stub_by_path(path) - RUBYGEMS_ACTIVATION_MONITOR.exit - return gem_original_require(path) + next end # Attempt to find +path+ in any unresolved gems... @@ -124,7 +111,6 @@ module Kernel names = found_specs.map(&:name).uniq if names.size > 1 - RUBYGEMS_ACTIVATION_MONITOR.exit raise Gem::LoadError, "#{path} found in multiple gems: #{names.join ", "}" end @@ -135,26 +121,20 @@ module Kernel unless valid le = Gem::LoadError.new "unable to find a version of '#{names.first}' to activate" le.name = names.first - RUBYGEMS_ACTIVATION_MONITOR.exit raise le end valid.activate end + end - RUBYGEMS_ACTIVATION_MONITOR.exit + begin gem_original_require(path) rescue LoadError => load_error - if load_error.path == path - RUBYGEMS_ACTIVATION_MONITOR.enter - - begin - require_again = Gem.try_activate(path) - ensure - RUBYGEMS_ACTIVATION_MONITOR.exit - end + if load_error.path == path && + RUBYGEMS_ACTIVATION_MONITOR.synchronize { Gem.try_activate(path) } - return gem_original_require(path) if require_again + return gem_original_require(path) end raise load_error |