class PikaQue::Launcher

Attributes

runnable[RW]
sig_read[RW]
sig_write[RW]

Public Class Methods

launch(runnable) { || ... } click to toggle source
# File lib/pika_que/launcher.rb, line 9
def self.launch(runnable)
  if block_given?
    new(runnable).launch { yield }
  else
    new(runnable).launch
  end
end
new(runnable) click to toggle source
# File lib/pika_que/launcher.rb, line 5
def initialize(runnable)
  @runnable = runnable
end

Public Instance Methods

launch() { || ... } click to toggle source
# File lib/pika_que/launcher.rb, line 17
def launch
  @sig_read, @sig_write = IO.pipe

  register_signals

  if block_given?
    yield
  else
    runnable.run
  end

  while readable_io = wait_for_signal
    signal = readable_io.first[0].gets.strip
    handle_signal(signal)
  end
  
end

Private Instance Methods

handle_signal(signal) click to toggle source
# File lib/pika_que/launcher.rb, line 56
def handle_signal(signal)
  case signal
  when 'INT'
    logger.info "Received INT"
    raise Interrupt
  when 'TERM'
    logger.info "Received TERM"
    raise Interrupt
  when 'TTIN'
    logger.info "Received TTIN"
    log_thread_backtraces
  when 'TSTP'
    logger.info "Received TSTP"
    runnable.stop
  when 'USR1'
    logger.info "Received USR1"
    runnable.stop
  when 'USR2'
    logger.info "Received USR2"
    # TODO ?
  end
end
log_thread_backtraces() click to toggle source
# File lib/pika_que/launcher.rb, line 79
def log_thread_backtraces
  Thread.list.each do |thread|
    logger.warn "Thread TID-#{thread.object_id.to_s(36)} #{thread['label']}"
    if thread.backtrace
      logger.warn thread.backtrace.join("\n")
    else
      logger.warn "<no backtrace available>"
    end
  end
end
register_signals() click to toggle source
# File lib/pika_que/launcher.rb, line 39
def register_signals
  signals = %w(INT TERM TTIN TSTP)
  if !defined?(::JRUBY_VERSION)
    signals += %w(USR1 USR2)
  end

  signals.each do |sig|
    trap sig do
      sig_write.puts(sig)
    end if Signal.list.keys.include?(sig)
  end
end
wait_for_signal() click to toggle source
# File lib/pika_que/launcher.rb, line 52
def wait_for_signal
  IO.select([sig_read])
end