class Mimi::Signal

Constants

VERSION

Attributes

signal[R]

Public Class Methods

new(signal, &block) click to toggle source

Creates a signal handler and installs it.

@see Mimi::Signal.trap

# File lib/mimi/signal.rb, line 32
def initialize(signal, &block)
  self.class.handlers[signal.to_sym] ||= { old_trap: nil, blocks: [] }
  self.class.handlers[signal.to_sym][:blocks].push(block)
  self.class.handlers[signal.to_sym][:old_trap] ||=
    Kernel.trap(signal) { self.class.queue << signal.to_sym }
  self.class.start
end

Private Class Methods

start() click to toggle source

Starts the background thread which monitors queued signals. Invoked implicitly when any signal handler is installed

# File lib/mimi/signal.rb, line 56
def self.start
  return if @thread
  @thread = Thread.new do
    loop do
      signal = queue.pop # it's blocking
      handlers[signal][:blocks].each(&:call) if handlers[signal]
    end
  end
end
stop() click to toggle source

Stops the Mimi::Signal, untraps all trapped signals

# File lib/mimi/signal.rb, line 68
def self.stop
  return unless @thread
  handlers.keys.each do |signal|
    Kernel.trap(signal, handlers[signal][:old_trap])
  end
  @thread.kill
  @thread = nil
  @handlers = nil
end
trap(*signals, &block) click to toggle source

Traps a signal (or multiple signals) and installs the signal handler

@param [Array<String,Symbol>] signals

@example

Mimi::Signal.trap('INT', 'TERM') do
  # graceful shutdown
end
# File lib/mimi/signal.rb, line 49
def self.trap(*signals, &block)
  signals.each { |s| new(s, &block) }
end