class WEBrick::Utils::TimeoutHandler
Class used to manage timeout handlers across multiple threads.
Timeout handlers should be managed by using the class methods which are synchronized.
id = TimeoutHandler.register(10, Timeout::Error) begin sleep 20 puts 'foo' ensure TimeoutHandler.cancel(id) end
will raise Timeout::Error
id = TimeoutHandler.register(10, Timeout::Error) begin sleep 5 puts 'foo' ensure TimeoutHandler.cancel(id) end
will print 'foo'
Public Class Methods
cancel(id)
click to toggle source
Cancels the timeout handler id
# File lib/webrick/utils.rb, line 167 def TimeoutHandler.cancel(id) TimeoutMutex.synchronize{ instance.cancel(Thread.current, id) } end
new()
click to toggle source
Creates a new TimeoutHandler. You should use ::register and ::cancel instead of creating the timeout handler directly.
# File lib/webrick/utils.rb, line 176 def initialize @timeout_info = Hash.new Thread.start{ while true now = Time.now @timeout_info.keys.each{|thread| ary = @timeout_info[thread] next unless ary ary.dup.each{|info| time, exception = *info interrupt(thread, info.object_id, exception) if time < now } } sleep 0.5 end } end
register(seconds, exception)
click to toggle source
Public Instance Methods
cancel(thread, id)
click to toggle source
Cancels the timeout handler id
# File lib/webrick/utils.rb, line 217 def cancel(thread, id) if ary = @timeout_info[thread] ary.delete_if{|info| info.object_id == id } if ary.empty? @timeout_info.delete(thread) end return true end return false end
interrupt(thread, id, exception)
click to toggle source
Interrupts the timeout handler id
and raises
exception
# File lib/webrick/utils.rb, line 196 def interrupt(thread, id, exception) TimeoutMutex.synchronize{ if cancel(thread, id) && thread.alive? thread.raise(exception, "execution timeout") end } end
register(thread, time, exception)
click to toggle source
Registers a new timeout handler
# File lib/webrick/utils.rb, line 209 def register(thread, time, exception) @timeout_info[thread] ||= Array.new @timeout_info[thread] << [time, exception] return @timeout_info[thread].last.object_id end