async-pool 0.3.4 → 0.3.8

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 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.