class Bundler::Installer
def install_in_parallel(size, standalone)
def install_in_parallel(size, standalone) name2spec = {} remains = {} enqueued = {} specs.each do |spec| name2spec[spec.name] = spec remains[spec.name] = true end worker_pool = ParallelWorkers.worker_pool size, lambda { |name, worker| spec = name2spec[name] message = install_gem_from_spec spec, standalone, worker { :name => spec.name, :post_install => message } } specs.each do |spec| deps = spec.dependencies.select { |dep| dep.type != :development } if deps.empty? worker_pool.enq spec.name enqueued[spec.name] = true end end until remains.empty? message = worker_pool.deq remains.delete message[:name] if message[:post_install] Installer.post_install_messages[message[:name]] = message[:post_install] end remains.keys.each do |name| next if enqueued[name] spec = name2spec[name] deps = spec.dependencies.select { |dep| remains[dep.name] and dep.type != :development } if deps.empty? worker_pool.enq name enqueued[name] = true end end end check_rubygems_cache_dir message ensure worker_pool && worker_pool.stop end