class Bigcommerce::Multitrap::Trap

Constants

KNOWN_SIGNALS
OWN_MRI_FRAME
OWN_RBX_FRAME
RESERVED_SIGNALS
TRAVIS_FRAME

Public Class Methods

__clear_all_handlers!() click to toggle source
# File lib/bigcommerce/multitrap/trap.rb, line 25
def self.__clear_all_handlers!
  @@multitrap ||= nil
  @@multitrap && @@multitrap.__clear_all_handlers!
end
new(original_trap) click to toggle source
# File lib/bigcommerce/multitrap/trap.rb, line 30
def initialize(original_trap)
  @original_trap = original_trap
  @trap_list = create_trap_list
end
trap(original_trap, *args, &block) click to toggle source
# File lib/bigcommerce/multitrap/trap.rb, line 16
def self.trap(original_trap, *args, &block)
  @@multitrap ||= new(original_trap)

  signal = args[0]
  command = args[1]

  @@multitrap.store_trap(signal, command, &block)
end

Public Instance Methods

__clear_all_handlers!() click to toggle source
# File lib/bigcommerce/multitrap/trap.rb, line 65
def __clear_all_handlers!
  @trap_list.keys.select {|s| KNOWN_SIGNALS.include?(s) }.each do |signal|
    @original_trap.call(signal, 'DEFAULT')
  end

  @trap_list = create_trap_list
end
store_trap(signal, command, &block) click to toggle source
# File lib/bigcommerce/multitrap/trap.rb, line 35
def store_trap(signal, command, &block)
  signal = signal.to_s
  command ||= block

  trap_is_nested = nested_trap?

  if trap_is_nested
    # JRuby doesn't support nested traps.
    return if Multitrap.jruby?
    @trap_list[signal].pop
  end

  @trap_list[signal] << command

  prev_trap_handler = @original_trap.call(signal) do |signo|
    @trap_list[signal].reverse_each do |trap_handler|
      trap_handler.call(signo || Signal.list[signal]) if trap_handler.respond_to?(:call)
    end
  end

  if !trap_is_nested &&
     @trap_list[signal].size == 1 &&
     !default_handler?(prev_trap_handler) &&
     !default_handler_path?(prev_trap_handler)
    @trap_list[signal].unshift(prev_trap_handler)
  end

  @trap_list
end

Private Instance Methods

create_trap_list() click to toggle source
# File lib/bigcommerce/multitrap/trap.rb, line 92
def create_trap_list
  Hash.new { |h, k| h[k] = [] }
end
default_handler?(prev) click to toggle source
# File lib/bigcommerce/multitrap/trap.rb, line 96
def default_handler?(prev)
  %w[DEFAULT SYSTEM_DEFAULT IGNORE].any? { |h| h == prev }
end
default_handler_path?(prev) click to toggle source
# File lib/bigcommerce/multitrap/trap.rb, line 100
def default_handler_path?(prev)
  [%r{Proc:.+@kernel/loader\.rb:[0-9]{1,4}},
   %r{Proc:.+@uri:classloader:/jruby/kernel/signal.rb:[0-9]{1,4}}].any? do |h|
    h =~ prev.to_s
   end
end