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| if ready_to_install?(spec, remains) 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] if ready_to_install?(spec, remains) worker_pool.enq name enqueued[name] = true end end end message ensure worker_pool && worker_pool.stop end