itimer 6 → 7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 [](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
|