frugal_timeout 0.0.10 → 0.0.11
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.
- data/frugal_timeout.gemspec +2 -2
- data/lib/frugal_timeout.rb +19 -5
- data/spec/frugal_timeout_spec.rb +11 -0
- metadata +2 -2
data/frugal_timeout.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'frugal_timeout'
|
3
|
-
s.version = '0.0.
|
4
|
-
s.date = '2014-01-
|
3
|
+
s.version = '0.0.11'
|
4
|
+
s.date = '2014-01-03'
|
5
5
|
s.summary = 'Timeout.timeout replacement'
|
6
6
|
s.description = 'Timeout.timeout replacement that uses only 1 thread'
|
7
7
|
s.authors = ['Dmitry Maksyoma']
|
data/lib/frugal_timeout.rb
CHANGED
@@ -77,7 +77,10 @@ module FrugalTimeout
|
|
77
77
|
|
78
78
|
def enforceTimeout
|
79
79
|
@@mutex.synchronize {
|
80
|
-
|
80
|
+
return if @defused
|
81
|
+
|
82
|
+
@thread.raise @klass, 'execution expired'
|
83
|
+
true
|
81
84
|
}
|
82
85
|
end
|
83
86
|
end
|
@@ -97,6 +100,10 @@ module FrugalTimeout
|
|
97
100
|
end
|
98
101
|
private :defuse_thread!
|
99
102
|
|
103
|
+
def onEnforce &b
|
104
|
+
@onEnforce = b
|
105
|
+
end
|
106
|
+
|
100
107
|
def onNewNearestRequest &b
|
101
108
|
@onNewNearestRequest = b
|
102
109
|
end
|
@@ -104,14 +111,17 @@ module FrugalTimeout
|
|
104
111
|
# Purge and enforce expired timeouts. Only enforce once for each thread,
|
105
112
|
# even if multiple timeouts for that thread expire at once.
|
106
113
|
def purgeExpired
|
107
|
-
|
114
|
+
filter, now = {}, MonotonicTime.now
|
108
115
|
@requests.synchronize {
|
116
|
+
@onEnforce.call if @onEnforce
|
117
|
+
|
109
118
|
@requests.reject_and_get! { |r| r.at <= now }.each { |r|
|
110
119
|
next if filter[r.thread]
|
111
120
|
|
112
|
-
r.enforceTimeout
|
113
|
-
|
114
|
-
|
121
|
+
if r.enforceTimeout
|
122
|
+
defuse_thread! r.thread
|
123
|
+
filter[r.thread] = true
|
124
|
+
end
|
115
125
|
}
|
116
126
|
|
117
127
|
# It's necessary to call onNewNearestRequest inside synchronize as other
|
@@ -292,6 +302,10 @@ module FrugalTimeout
|
|
292
302
|
end'
|
293
303
|
end
|
294
304
|
|
305
|
+
def self.on_enforce &b #:nodoc:
|
306
|
+
@requestQueue.onEnforce &b
|
307
|
+
end
|
308
|
+
|
295
309
|
def self.on_ensure &b #:nodoc:
|
296
310
|
@onEnsure = b
|
297
311
|
end
|
data/spec/frugal_timeout_spec.rb
CHANGED
@@ -122,6 +122,17 @@ describe FrugalTimeout do
|
|
122
122
|
}.to raise_error Timeout::Error
|
123
123
|
end
|
124
124
|
|
125
|
+
it 'raises exception if inner timeout is defused before it is enforced' do
|
126
|
+
expect {
|
127
|
+
timeout(0.05, IOError) {
|
128
|
+
FrugalTimeout.on_enforce { sleep 0.02 }
|
129
|
+
timeout(0.01) { }
|
130
|
+
FrugalTimeout.on_enforce
|
131
|
+
sleep 0.06
|
132
|
+
}
|
133
|
+
}.to raise_error IOError
|
134
|
+
end
|
135
|
+
|
125
136
|
context "doesn't raise second exception in the same thread" do
|
126
137
|
before :all do
|
127
138
|
FrugalTimeout.on_ensure { sleep 0.02 }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: frugal_timeout
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.11
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-01-
|
12
|
+
date: 2014-01-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|