Module: FrugalTimeout

Defined in:
lib/frugal_timeout.rb,
lib/frugal_timeout/support.rb

Overview

Copyright © 2013, 2014 by Dmitry Maksyoma <[email protected]>

Defined Under Namespace

Modules: Hookable Classes: Error, Request, RequestQueue, SleeperNotifier, SortedQueue, Storage

Class Method Summary collapse

Class Method Details

.dropin!Object

Ensure that calling timeout() will use FrugalTimeout.timeout()



226
227
228
229
230
231
# File 'lib/frugal_timeout.rb', line 226

def self.dropin!
  Object.class_eval \
    'def timeout t, klass=nil, &b
FrugalTimeout.timeout t, klass, &b
     end'
end

.on_enforce(&b) ⇒ Object

:nodoc:



233
234
235
# File 'lib/frugal_timeout.rb', line 233

def self.on_enforce &b #:nodoc:
  @requestQueue.onEnforce &b
end

.on_ensure(&b) ⇒ Object

:nodoc:



237
238
239
# File 'lib/frugal_timeout.rb', line 237

def self.on_ensure &b #:nodoc:
  @onEnsure = b
end

.timeout(sec, klass = nil) ⇒ Object

Same as Timeout.timeout()



242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
# File 'lib/frugal_timeout.rb', line 242

def self.timeout sec, klass=nil
  return yield sec if sec.nil? || sec <= 0

  innerException = klass || Class.new(Timeout::ExitException)
  begin
    request = @requestQueue.queue(sec, innerException)
    # Defuse is here only for the case when exception comes from the yield
    # block. Otherwise, when timeout exception is raised, the request is
    # defused automatically.
    #
    # Now, if in ensure, timeout exception comes, the request has already been
    # defused automatically, so even if ensure is interrupted, there's no
    # problem.
    begin
	yield sec
    ensure
	request.defuse!
    end
  rescue innerException => e
    raise if klass

    raise Error, e.message, e.backtrace
  ensure
    @onEnsure.call if @onEnsure
  end
end