Sha256: 296c1650ca7c7afc11644a83197bf5701d83ab4bcec6b2938d7a5e65496a6da0
Contents?: true
Size: 1.8 KB
Versions: 3
Compression:
Stored size: 1.8 KB
Contents
module PikaQue class Launcher include Logging def initialize(runnable) @runnable = runnable end def self.launch(runnable) if block_given? new(runnable).launch { yield } else new(runnable).launch end end 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 attr_accessor :runnable, :sig_read, :sig_write 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 def wait_for_signal IO.select([sig_read]) end 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 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 end end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
pika_que-0.3.0 | lib/pika_que/launcher.rb |
pika_que-0.2.0 | lib/pika_que/launcher.rb |
pika_que-0.1.6 | lib/pika_que/launcher.rb |