class Procodile::SignalHandler

Attributes

pipe[R]

Public Class Methods

new(*signals) click to toggle source
# File lib/procodile/signal_handler.rb, line 10
def initialize(*signals)
  @handlers = {}
  reader, writer = IO.pipe
  @pipe = {:reader => reader, :writer => writer}
  signals.each do |sig|
    Signal.trap(sig, proc { SignalHandler.queue << sig ; notice })
  end
end
queue() click to toggle source
# File lib/procodile/signal_handler.rb, line 6
def self.queue
  Thread.main[:signal_queue] ||= []
end

Public Instance Methods

handle() click to toggle source
# File lib/procodile/signal_handler.rb, line 37
def handle
  if signal = self.class.queue.shift
    Procodile.log nil, 'system', "Supervisor received #{signal} signal"
    if @handlers[signal]
      @handlers[signal].each(&:call)
    end
  end
end
notice() click to toggle source
# File lib/procodile/signal_handler.rb, line 33
def notice
  @pipe[:writer].write_nonblock('.')
end
register(name, &block) click to toggle source
# File lib/procodile/signal_handler.rb, line 28
def register(name, &block)
  @handlers[name] ||= []
  @handlers[name] << block
end
start() click to toggle source
# File lib/procodile/signal_handler.rb, line 19
def start
  Thread.new do
    loop do
      handle
      sleep 1
    end
  end
end