async-pool 0.3.4 → 0.3.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 53496ca8f02b057c94d8cef37e92f7d14bb3d7062267ea53f363d5ca3c2ee7d4
4
- data.tar.gz: b59bb3a498bb16b1306eea4b6bcb765efa60a479701f546a3c2b6785ff5203e1
3
+ metadata.gz: cc9d27508f2aedf6acd28b377ecedf2a05a1b8d18441aa523e5ddcdb1f3a726b
4
+ data.tar.gz: b18617893727bbe6d2a90adaafdcc7e92d8847c4ecb3a7caa519e183a7439be7
5
5
  SHA512:
6
- metadata.gz: f53063512c044675725eed75b72346644a36c99704bf2f1559692420f7176b88063cb79200d4a24f19f8cd081be224e307a811d91dc8a94923cccb87cf850cc4
7
- data.tar.gz: 366355082c92722989dd76607f611fd81f520844b8733e15872db4164a146bc2e257e40f316bc87c173a49b65d465e07cccdf459fea242b9c8445841c13f7580
6
+ metadata.gz: 39fe6f2c7f4eae7c215c779c1989814fb6f7126aaa6963ec8ee2c73f3f20132b4a985de53819a064f2fab5813a25131bf907c72e0b13758f24a17b6543a01072
7
+ data.tar.gz: e7f584de1b1bea95655e00b76b167268d74ae54f76e15a6bee614513575f7d3f7e108bade126a8c2c598a4fd8bde8857a8d26481842ef5eac5b00551d9550f07
@@ -18,7 +18,7 @@
18
18
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
19
  # THE SOFTWARE.
20
20
 
21
- require 'async/logger'
21
+ require 'console/logger'
22
22
 
23
23
  require 'async'
24
24
  require 'async/notification'
@@ -98,15 +98,19 @@ module Async
98
98
 
99
99
  # Make the resource resources and let waiting tasks know that there is something resources.
100
100
  def release(resource)
101
+ reused = false
102
+
101
103
  # A resource that is not good should also not be reusable.
102
104
  if resource.reusable?
103
- reuse(resource)
104
- else
105
- retire(resource)
105
+ reused = reuse(resource)
106
106
  end
107
+ ensure
108
+ retire(resource) unless reused
107
109
  end
108
110
 
109
111
  def close
112
+ @available.clear
113
+
110
114
  @resources.each_key(&:close)
111
115
  @resources.clear
112
116
 
@@ -155,7 +159,7 @@ module Async
155
159
  end
156
160
 
157
161
  def retire(resource)
158
- Async.logger.debug(self) {"Retire #{resource}"}
162
+ Console.logger.debug(self) {"Retire #{resource}"}
159
163
 
160
164
  @resources.delete(resource)
161
165
 
@@ -169,7 +173,7 @@ module Async
169
173
  def start_gardener
170
174
  return if @gardener
171
175
 
172
- Async(transient: true) do |task|
176
+ Async(transient: true, annotation: "#{self.class} Gardener") do |task|
173
177
  @gardener = task
174
178
 
175
179
  Task.yield
@@ -205,7 +209,7 @@ module Async
205
209
  end
206
210
 
207
211
  def reuse(resource)
208
- Async.logger.debug(self) {"Reuse #{resource}"}
212
+ Console.logger.debug(self) {"Reuse #{resource}"}
209
213
  usage = @resources[resource]
210
214
 
211
215
  if usage.zero?
@@ -227,6 +231,8 @@ module Async
227
231
  @resources[resource] = usage - 1
228
232
 
229
233
  @notification.signal
234
+
235
+ return true
230
236
  end
231
237
 
232
238
  def wait_for_resource
@@ -235,7 +241,7 @@ module Async
235
241
  @notification.wait
236
242
  end
237
243
 
238
- Async.logger.debug(self) {"Wait for resource -> #{resource}"}
244
+ Console.logger.debug(self) {"Wait for resource -> #{resource}"}
239
245
 
240
246
  # if resource.concurrency > 1
241
247
  # @notification.signal
@@ -263,36 +269,45 @@ module Async
263
269
 
264
270
  # @returns [Object] An existing resource in a "used" state.
265
271
  def available_resource
272
+ resource = nil
273
+
266
274
  @guard.acquire do
267
- while resource = @available.last
268
- if usage = @resources[resource] and usage < resource.concurrency
269
- if resource.viable?
270
- usage = (@resources[resource] += 1)
271
-
272
- if usage == resource.concurrency
273
- # The resource is used up to it's limit:
274
- @available.pop
275
- end
276
-
277
- return resource
278
- else
279
- retire(resource)
275
+ resource = get_resource
276
+ end
277
+
278
+ return resource
279
+ rescue Exception
280
+ reuse(resource) if resource
281
+ raise
282
+ end
283
+
284
+ private def get_resource
285
+ while resource = @available.last
286
+ if usage = @resources[resource] and usage < resource.concurrency
287
+ if resource.viable?
288
+ usage = (@resources[resource] += 1)
289
+
290
+ if usage == resource.concurrency
291
+ # The resource is used up to it's limit:
280
292
  @available.pop
281
293
  end
294
+
295
+ return resource
282
296
  else
283
- # The resource has been removed already, so skip it and remove it from the availability list.
297
+ retire(resource)
284
298
  @available.pop
285
299
  end
286
- end
287
-
288
- if @limit.nil? or @resources.size < @limit
289
- Async.logger.debug(self) {"No available resources, allocating new one..."}
290
-
291
- return create_resource
300
+ else
301
+ # The resource has been removed already, so skip it and remove it from the availability list.
302
+ @available.pop
292
303
  end
293
304
  end
294
305
 
295
- return nil
306
+ if @limit.nil? or @resources.size < @limit
307
+ Console.logger.debug(self) {"No available resources, allocating new one..."}
308
+
309
+ return create_resource
310
+ end
296
311
  end
297
312
  end
298
313
  end
@@ -18,7 +18,7 @@
18
18
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
19
  # THE SOFTWARE.
20
20
 
21
- require 'async/logger'
21
+ require 'console/logger'
22
22
 
23
23
  require 'async/notification'
24
24
  require 'async/semaphore'
@@ -20,6 +20,6 @@
20
20
 
21
21
  module Async
22
22
  module Pool
23
- VERSION = "0.3.4"
23
+ VERSION = "0.3.8"
24
24
  end
25
25
  end
metadata CHANGED
@@ -1,27 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: async-pool
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
4
+ version: 0.3.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-07 00:00:00.000000000 Z
11
+ date: 2021-07-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.25'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.25'
27
27
  - !ruby/object:Gem::Dependency
@@ -138,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
138
  - !ruby/object:Gem::Version
139
139
  version: '0'
140
140
  requirements: []
141
- rubygems_version: 3.1.2
141
+ rubygems_version: 3.2.22
142
142
  signing_key:
143
143
  specification_version: 4
144
144
  summary: A singleplex and multiplex resource pool for implementing robust clients.