class DopCommon::SignalHandler

Constants

DEFAULT_SIGNALS

Public Class Methods

new() click to toggle source
# File lib/dop_common/signal_handler.rb, line 15
def initialize
  @signal_queue = []
  @self_reader, @self_writer = IO.pipe
end

Public Instance Methods

handle_signals(*signals) { |shift| ... } click to toggle source
# File lib/dop_common/signal_handler.rb, line 20
def handle_signals(*signals)
  signals = DEFAULT_SIGNALS if signals.empty?
  old_handlers = setup_signal_traps(signals)
  loop do
    begin
      if @signal_queue.any?
        yield(@signal_queue.shift) if block_given?
      else
        IO.select([@self_reader])
        @self_reader.read_nonblock(1)
      end
    rescue
      break
    end
  end
  teardown_signal_traps(old_handlers)
end

Private Instance Methods

setup_signal_traps(signals) click to toggle source
# File lib/dop_common/signal_handler.rb, line 40
def setup_signal_traps(signals)
  signals.each_with_object({}) do |signal, old_handlers|
    DopCommon.log.debug("Installing trap for signal #{signal.to_s}")
    old_handlers[signal] = Signal.trap(signal) do
      @signal_queue << { signal => Time.now }
      @self_writer.write_nonblock('.')
    end
  end
end
teardown_signal_traps(old_handlers) click to toggle source
# File lib/dop_common/signal_handler.rb, line 50
def teardown_signal_traps(old_handlers)
  old_handlers.each do |signal, old_handler|
    DopCommon.log.debug("Removing trap for signal #{signal.to_s}")
    Signal.trap(signal, old_handler)
  end
end