Module: Itimer

Defined in:
lib/itimer.rb

Defined Under Namespace

Classes: Timeout

Class Method Summary collapse

Class Method Details

.timeout(seconds, klass = Timeout) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/itimer.rb', line 7

def self.timeout(seconds, klass=Timeout)
  Signal.trap 'ALRM' do
    raise klass
  end

  prev = get(:real)
  start = Time.now
  if prev > 0
    seconds = [prev, seconds].min
  end

  begin
    set(:real, seconds)
    ret = yield
  ensure
    if prev > 0
      set(:real, [prev - (Time.now-start), 0].max)
    else
      set(:real, 0)
    end
  end

  return ret
end