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