diff --git a/bundler/lib/bundler/shared_helpers.rb b/bundler/lib/bundler/shared_helpers.rb index f43e3301efa6..405ade95ddfa 100644 --- a/bundler/lib/bundler/shared_helpers.rb +++ b/bundler/lib/bundler/shared_helpers.rb @@ -145,13 +145,6 @@ def print_major_deprecations! Bundler.ui.warn message end - def trap(signal, override = false, &block) - prior = Signal.trap(signal) do - block.call - prior.call unless override - end - end - def ensure_same_dependencies(spec, old_deps, new_deps) new_deps = new_deps.reject {|d| d.type == :development } old_deps = old_deps.reject {|d| d.type == :development } diff --git a/bundler/lib/bundler/worker.rb b/bundler/lib/bundler/worker.rb index 03800965232f..08f60f675d96 100644 --- a/bundler/lib/bundler/worker.rb +++ b/bundler/lib/bundler/worker.rb @@ -26,7 +26,6 @@ def initialize(size, name, func) @func = func @size = size @threads = nil - SharedHelpers.trap("INT") { abort_threads } end # Enqueue a request to be executed in the worker pool @@ -68,13 +67,16 @@ def apply_func(obj, i) # so as worker threads after retrieving it, shut themselves down def stop_threads return unless @threads + @threads.each { @request_queue.enq POISON } @threads.each(&:join) + + remove_interrupt_handler + @threads = nil end def abort_threads - return unless @threads Bundler.ui.debug("\n#{caller.join("\n")}") @threads.each(&:exit) exit 1 @@ -94,11 +96,21 @@ def create_threads end end.compact + add_interrupt_handler unless @threads.empty? + return if creation_errors.empty? message = "Failed to create threads for the #{name} worker: #{creation_errors.map(&:to_s).uniq.join(", ")}" raise ThreadCreationError, message if @threads.empty? Bundler.ui.info message end + + def add_interrupt_handler + @previous_interrupt_handler = trap("INT") { abort_threads } + end + + def remove_interrupt_handler + trap "INT", @previous_interrupt_handler + end end end