class ServerEngine::SignalThread
Public Class Methods
new(&block)
click to toggle source
Calls superclass method
# File lib/serverengine/signal_thread.rb, line 21 def initialize(&block) @handlers = {} @mutex = Mutex.new @cond = ConditionVariable.new @queue = [] @finished = false block.call(self) if block super(&method(:main)) end
Public Instance Methods
handlers()
click to toggle source
# File lib/serverengine/signal_thread.rb, line 54 def handlers @handlers.dup end
stop()
click to toggle source
# File lib/serverengine/signal_thread.rb, line 58 def stop @mutex.synchronize do @finished = true @cond.broadcast end self end
trap(sig, command=nil, &block)
click to toggle source
# File lib/serverengine/signal_thread.rb, line 34 def trap(sig, command=nil, &block) # normalize signal names sig = sig.to_s.upcase if sig[0,3] == "SIG" sig = sig[3..-1] end sig = sig.to_sym old = @handlers[sig] if block Kernel.trap(sig) { signal_handler_main(sig) } @handlers[sig] = block else Kernel.trap(sig, command) @handlers.delete(sig) end old end
Private Instance Methods
enqueue(sig)
click to toggle source
# File lib/serverengine/signal_thread.rb, line 108 def enqueue(sig) @mutex.synchronize do @queue << sig @cond.broadcast end end
main()
click to toggle source
# File lib/serverengine/signal_thread.rb, line 80 def main until @finished sig = nil @mutex.synchronize do while true return if @finished sig = @queue.shift break if sig @cond.wait(@mutex, 1) end end begin @handlers[sig].call(sig) rescue => e ServerEngine.dump_uncaught_error(e) end end nil ensure @finished = false end
signal_handler_main(sig)
click to toggle source
# File lib/serverengine/signal_thread.rb, line 68 def signal_handler_main(sig) # here always creates new thread to avoid # complicated race condition in signal handlers Thread.new do begin enqueue(sig) rescue => e ServerEngine.dump_uncaught_error(e) end end end