aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2023-07-19 22:38:27 +0900
committergit <svn-admin@ruby-lang.org>2023-07-25 04:52:54 +0000
commit1b27e7aa1fbd4c3c9a8640e94b1cd8818f4901d1 (patch)
tree325a2737cb4f6bbef55ab8fb73246eb9ed235935
parentf72ddd92be0ea80cfc230c5d972d27f91dd3cb1b (diff)
downloadruby-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.rb44
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