lib/qs/qs_runner.rb in qs-0.6.1 vs lib/qs/qs_runner.rb in qs-0.7.0

- old
+ new

@@ -1,6 +1,6 @@ -require 'system_timer' +require 'much-timeout' require 'qs' require 'qs/runner' module Qs @@ -12,34 +12,26 @@ super(handler_class, args) @timeout = handler_class.timeout || Qs.config.timeout end def run - OptionalTimeout.new(self.timeout) do - self.handler.qs_run_callback 'before' - self.handler.qs_init - self.handler.qs_run - self.handler.qs_run_callback 'after' + MuchTimeout.optional_timeout(self.timeout, TimeoutInterrupt) do + catch(:halt) do + self.handler.qs_run_callback 'before' + catch(:halt){ self.handler.qs_init; self.handler.qs_run } + self.handler.qs_run_callback 'after' + end end - rescue TimeoutError => exception - error = TimeoutError.new "#{handler_class} timed out (#{timeout}s)" + rescue TimeoutInterrupt => exception + error = Qs::TimeoutError.new "#{handler_class} timed out (#{timeout}s)" error.set_backtrace(exception.backtrace) raise error end - private + # this error should never be "swallowed", if it is caught be sure to re-raise + # it so the workers will be able to honor their timeout setting. otherwise + # workers will never timeout. + TimeoutInterrupt = Class.new(Interrupt) - module OptionalTimeout - def self.new(timeout, &block) - if !timeout.nil? - SystemTimer.timeout_after(timeout, TimeoutError, &block) - else - block.call - end - end - end - end - - TimeoutError = Class.new(RuntimeError) end