itimer 6 → 7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -5
- data/lib/itimer.rb +25 -9
- data/test/itimer.rb +67 -4
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 03c7871d15f037b4eca089e3a450f11c9507f36a
|
4
|
+
data.tar.gz: e59146e12d5468383501dd68333441ee80db96c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1e0b85378dab98fde8370ed571ba7f42147837ab53937070bd4bf2693179db0a9aac9c2d09004383abb1ef735261e2c1edbfdf43793232316d85a3755d3f36a6
|
7
|
+
data.tar.gz: d0073c174fab5aa25cf8879f31ffaa1a03dd4e1289ed75e6a209f7aa7b73bd560639fb02a5a9ede0049a31622d5697f8cd3c9f9d0d85ce24f4ae323d29588933
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Itimer [![Build Status](https://
|
1
|
+
# Itimer [![Build Status](https://travis-ci.org/nearbuy/ruby-itimer.png)](https://travis-ci.org/nearbuy/ruby-itimer)
|
2
2
|
|
3
3
|
Drop-in replacement for stdlib Timeout that uses POSIX interval timers instead of threads. Not as portable but much lighter weight. Also includes low-level wrappers for setitimer and getitimer.
|
4
4
|
|
@@ -32,15 +32,15 @@ Signal.trap('VTALRM') { raise Itimer::Timeout }
|
|
32
32
|
begin
|
33
33
|
# set :real, :virtual and :prof
|
34
34
|
Itimer.set(:virtual, 1)
|
35
|
-
|
35
|
+
do_expensive_computation()
|
36
36
|
rescue Itimer::Timeout
|
37
37
|
puts 'Execution time expired'
|
38
38
|
end
|
39
39
|
|
40
40
|
Signal.trap('ALRM') { print '.' }
|
41
41
|
|
42
|
-
Itimer.
|
43
|
-
|
42
|
+
Itimer.set_interval(:real, 0.5)
|
43
|
+
do_expensive_computation()
|
44
44
|
puts 'Done'
|
45
45
|
```
|
46
46
|
|
@@ -55,10 +55,11 @@ getitimer(2), setitimer(2)
|
|
55
55
|
## Authors
|
56
56
|
|
57
57
|
* Nate Mueller ([natemueller](https://github.com/natemueller))
|
58
|
+
* Peter Sanford ([psanford](https://github.com/psanford))
|
58
59
|
|
59
60
|
## License
|
60
61
|
|
61
|
-
Copyright (c)
|
62
|
+
Copyright (c) 2013 Nearbuy Systems
|
62
63
|
|
63
64
|
Permission is hereby granted, free of charge, to any person obtaining
|
64
65
|
a copy of this software and associated documentation files (the
|
data/lib/itimer.rb
CHANGED
@@ -5,8 +5,13 @@ module Itimer
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def self.timeout(seconds, klass=Timeout)
|
8
|
-
|
9
|
-
|
8
|
+
@counter ||= 0
|
9
|
+
@counter += 1
|
10
|
+
|
11
|
+
catch_name = "itimer_#{@counter}"
|
12
|
+
|
13
|
+
prev_handler = Signal.trap 'ALRM' do
|
14
|
+
throw catch_name
|
10
15
|
end
|
11
16
|
|
12
17
|
prev = get(:real)
|
@@ -15,17 +20,28 @@ module Itimer
|
|
15
20
|
seconds = [prev, seconds].min
|
16
21
|
end
|
17
22
|
|
18
|
-
|
23
|
+
timed_out = true
|
24
|
+
|
25
|
+
catch catch_name do
|
19
26
|
set(:real, seconds)
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
27
|
+
begin
|
28
|
+
ret = yield
|
29
|
+
timed_out = false
|
30
|
+
ensure
|
31
|
+
if prev > 0
|
32
|
+
set(:real, [prev - (Time.now-start), 0.01].max)
|
33
|
+
else
|
34
|
+
set(:real, 0)
|
35
|
+
end
|
36
|
+
|
37
|
+
Signal.trap('ALRM', prev_handler)
|
26
38
|
end
|
27
39
|
end
|
28
40
|
|
41
|
+
if timed_out
|
42
|
+
raise klass
|
43
|
+
end
|
44
|
+
|
29
45
|
return ret
|
30
46
|
end
|
31
47
|
end
|
data/test/itimer.rb
CHANGED
@@ -3,19 +3,35 @@ require 'test/unit'
|
|
3
3
|
require 'itimer/compat'
|
4
4
|
|
5
5
|
class ItimerTest < Test::Unit::TestCase
|
6
|
+
def teardown
|
7
|
+
assert_equal( 0, Itimer.get(:real) )
|
8
|
+
assert_equal( 0, Itimer.get(:virtual) )
|
9
|
+
assert_equal( 0, Itimer.get(:prof) )
|
10
|
+
end
|
11
|
+
|
6
12
|
def test_itimer
|
7
13
|
Signal.trap 'ALRM' do
|
8
14
|
raise Exception.new('ALRM')
|
9
15
|
end
|
10
16
|
|
11
|
-
Signal.trap 'VTALRM' do
|
12
|
-
raise Exception.new('VTALRM')
|
13
|
-
end
|
14
|
-
|
15
17
|
Signal.trap 'PROF' do
|
16
18
|
raise Exception.new('PROF')
|
17
19
|
end
|
18
20
|
|
21
|
+
can_trap_vtalrm = true
|
22
|
+
begin
|
23
|
+
# this fails on ruby >= 2.0.0
|
24
|
+
Signal.trap('VTALRM', 'default')
|
25
|
+
rescue ArgumentError
|
26
|
+
can_trap_vtalrm = false
|
27
|
+
end
|
28
|
+
|
29
|
+
if can_trap_vtalrm
|
30
|
+
Signal.trap 'VTALRM' do
|
31
|
+
raise Exception.new('VTALRM')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
19
35
|
assert_equal( 0, Itimer.get(:real) )
|
20
36
|
assert_equal( 0, Itimer.get(:virtual) )
|
21
37
|
assert_equal( 0, Itimer.get(:prof) )
|
@@ -67,6 +83,7 @@ class ItimerTest < Test::Unit::TestCase
|
|
67
83
|
assert_equal( 'ALRM', wait_for_sig.call )
|
68
84
|
assert_in_delta( Time.now-start, 1.2, 0.1 )
|
69
85
|
Itimer.set_interval(:real, 0)
|
86
|
+
Itimer.set(:real, 0)
|
70
87
|
end
|
71
88
|
|
72
89
|
def test_timeout
|
@@ -101,7 +118,9 @@ class ItimerTest < Test::Unit::TestCase
|
|
101
118
|
end
|
102
119
|
end
|
103
120
|
assert_in_delta( Time.now-start, 0.1, 0.1 )
|
121
|
+
end
|
104
122
|
|
123
|
+
def test_nested_timeouts_inner_rescue
|
105
124
|
start = Time.now
|
106
125
|
timeouts = false
|
107
126
|
assert_raise( Itimer::Timeout ) do
|
@@ -118,6 +137,9 @@ class ItimerTest < Test::Unit::TestCase
|
|
118
137
|
end
|
119
138
|
assert( timeouts )
|
120
139
|
assert_in_delta( Time.now-start, 0.25, 0.1 )
|
140
|
+
end
|
141
|
+
|
142
|
+
def test_nested_timeouts_larger_inner
|
121
143
|
|
122
144
|
start = Time.now
|
123
145
|
timeouts = false
|
@@ -154,4 +176,45 @@ class ItimerTest < Test::Unit::TestCase
|
|
154
176
|
|
155
177
|
assert_equal( 0, Itimer.get(:real) )
|
156
178
|
end
|
179
|
+
|
180
|
+
def test_exceptions_caught_at_right_level
|
181
|
+
inner_exception = false
|
182
|
+
outer_exception = false
|
183
|
+
begin
|
184
|
+
Itimer.timeout(0.25) do
|
185
|
+
begin
|
186
|
+
sleep 0.5
|
187
|
+
rescue Itimer::Timeout
|
188
|
+
inner_exception = true
|
189
|
+
end
|
190
|
+
end
|
191
|
+
rescue Itimer::Timeout
|
192
|
+
outer_exception = true
|
193
|
+
end
|
194
|
+
|
195
|
+
assert( outer_exception )
|
196
|
+
assert( !inner_exception )
|
197
|
+
end
|
198
|
+
|
199
|
+
def test_throwing_exception_in_nested_itimer
|
200
|
+
inner_exception = false
|
201
|
+
outer_exception = false
|
202
|
+
begin
|
203
|
+
Itimer.timeout(0.25) do
|
204
|
+
begin
|
205
|
+
Itimer.timeout(0.1) do
|
206
|
+
throw ArgumentError
|
207
|
+
end
|
208
|
+
rescue ArgumentError
|
209
|
+
inner_exception = true
|
210
|
+
end
|
211
|
+
sleep 0.5
|
212
|
+
end
|
213
|
+
rescue Itimer::Timeout
|
214
|
+
outer_exception = true
|
215
|
+
end
|
216
|
+
|
217
|
+
assert( inner_exception )
|
218
|
+
assert( outer_exception )
|
219
|
+
end
|
157
220
|
end
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: itimer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '
|
4
|
+
version: '7'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nate Mueller
|
8
|
+
- Peter Sanford
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2013-
|
12
|
+
date: 2013-11-11 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: rake-compiler
|