mirror of
https://github.com/mistergibson/gxg-web-client.git
synced 2026-08-15 11:34:29 -07:00
71 lines
1.5 KiB
Ruby
71 lines
1.5 KiB
Ruby
module Signal
|
|
def self.trap(sig, prc=nil, &block)
|
|
sig = sig.to_s if sig.kind_of?(Symbol)
|
|
|
|
if sig.kind_of?(String)
|
|
osig = sig
|
|
|
|
if sig.prefix? "SIG"
|
|
sig = sig[3..-1]
|
|
end
|
|
|
|
unless number = Names[sig]
|
|
raise ArgumentError, "Unknown signal '#{osig}'"
|
|
end
|
|
else
|
|
number = sig.to_i
|
|
end
|
|
|
|
# If no command, use the block.
|
|
prc ||= block
|
|
prc = prc.to_s if prc.kind_of?(Symbol)
|
|
|
|
case prc
|
|
when "DEFAULT", "SIG_DFL"
|
|
had_old = @handlers.key?(number)
|
|
old = @handlers.delete(number)
|
|
|
|
if number != Names["EXIT"]
|
|
Rubinius.watch_signal(-number, prc.nil? || prc == 'IGNORE')
|
|
end
|
|
|
|
return "DEFAULT" unless had_old
|
|
return old ? old : nil
|
|
when "IGNORE", "SIG_IGN"
|
|
prc = "IGNORE"
|
|
when nil
|
|
prc = nil
|
|
when "EXIT"
|
|
prc = proc { exit }
|
|
when String
|
|
raise ArgumentError, "Unsupported command '#{prc}'"
|
|
else
|
|
unless prc.respond_to? :call
|
|
raise ArgumentError, "Handler must respond to #call (was #{prc.class})"
|
|
end
|
|
end
|
|
|
|
had_old = @handlers.key?(number)
|
|
|
|
old = @handlers[number]
|
|
@handlers[number] = prc
|
|
|
|
if number != Names["EXIT"]
|
|
Rubinius.watch_signal(number, prc.nil? || prc == 'IGNORE')
|
|
end
|
|
|
|
return "DEFAULT" unless had_old
|
|
return old ? old : nil
|
|
end
|
|
|
|
def self.run_handler(sig)
|
|
# Ignore nil handlers
|
|
if handler = @handlers[sig]
|
|
handler.call(sig)
|
|
end
|
|
end
|
|
|
|
def self.list
|
|
Names.dup
|
|
end
|
|
end
|