async-limiter 1.5.0 → 1.5.4

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: 89371390667823819a23be2b9b32fa67835de748ed46e456e3bef72af1086f9c
4
- data.tar.gz: 2cb73676f8f6d2f78d9eb7dfe5f7842076fc2121be674ce13f61ba26075633a3
3
+ metadata.gz: 69bd1687c9db3ae2672a5b2fb4458d127eb3521d5fc1db244f4ec7c773f32b39
4
+ data.tar.gz: 88b8a481dc2ad96e0b49aed1e80ddaa5871b0f8e36cd06526bf9854b32a1c23c
5
5
  SHA512:
6
- metadata.gz: 1eb18ea438a0aa21647a7630f11cdfc0318e2b1e5b9395f9476e1c05a1865e37a4a994e0fd877bca06aa62de1ce1429662fec1b8d450b8e88bd1eb1ab90ba105
7
- data.tar.gz: d0fb87462427dfef33c2967a594b6df029579f3bfd8afaf1f9fe6445abff60f9d147d4838c3edf9ded900488203669f3e53c04f2bde3c09edfafcd1181078148
6
+ metadata.gz: 4a656389da97b0990f90efa4dfbef3e58d01183969018a60b77b85704c014342d55eec954d00b3cf1870ccda8430843036ffcd49bc8449dba82a9b1c4f09d240
7
+ data.tar.gz: e63c0d3882fe2c3ad08648295bfe58a861f3ebaf1e0321ab2e6685dab5ec1a25e4184773206278497b2b94e15f67223f268dfdc16e1fb69f8a3db3b99919105c
@@ -1,5 +1,5 @@
1
1
  module Async
2
2
  module Limiter
3
- VERSION = "1.5.0"
3
+ VERSION = "1.5.4"
4
4
  end
5
5
  end
@@ -1,4 +1,5 @@
1
1
  require "async/clock"
2
+ require "async/notification"
2
3
  require "async/task"
3
4
  require_relative "constants"
4
5
 
@@ -25,7 +26,9 @@ module Async
25
26
  @lock = lock
26
27
 
27
28
  @waiting = queue
28
- @scheduler_task = nil
29
+ @scheduler = nil
30
+ @yield_wait = false
31
+ @yield_notification = Notification.new
29
32
 
30
33
  @window_frame_start_time = NULL_TIME
31
34
  @window_start_time = NULL_TIME
@@ -58,7 +61,7 @@ module Async
58
61
 
59
62
  def sync(*queue_args)
60
63
  acquire(*queue_args) do
61
- yield(@parent || Task.current)
64
+ yield Task.current
62
65
  end
63
66
  end
64
67
 
@@ -158,7 +161,14 @@ module Async
158
161
  # slipping in operations before other waiting fibers get resumed.
159
162
  if blocking? || @waiting.any?
160
163
  @waiting.push(fiber, *queue_args) # queue_args used for custom queues
164
+ @yield_wait = true
161
165
  schedule if schedule?
166
+
167
+ # Non-blocking signal, prevents race condition where scheduler would
168
+ # start resuming waiting fibers before below 'Task.yield' was reached.
169
+ @yield_notification.signal
170
+ @yield_wait = false # we're out of the woods
171
+
162
172
  loop do
163
173
  Task.yield # run this line at least once
164
174
  break unless blocking?
@@ -170,36 +180,43 @@ module Async
170
180
  end
171
181
 
172
182
  def schedule?
173
- @scheduler_task.nil? &&
183
+ @scheduler.nil? &&
174
184
  @waiting.any? &&
175
185
  !limit_blocking?
176
186
  end
177
187
 
178
188
  # Schedule resuming waiting tasks.
179
189
  def schedule(parent: @parent || Task.current)
180
- @scheduler_task ||=
181
- parent.async { |task|
182
- task.annotate("scheduling tasks for #{self.class}.")
183
-
184
- while @waiting.any? && !limit_blocking?
185
- delay = [next_acquire_time - Async::Clock.now, 0].max
186
- task.sleep(delay) if delay.positive?
187
- resume_waiting
188
- end
190
+ return @scheduler if @scheduler
191
+
192
+ parent.async(transient: true) do |task|
193
+ @scheduler = task
194
+ task.annotate("scheduling tasks for #{self.class}.")
195
+
196
+ while @waiting.any? && !limit_blocking?
197
+ delay = [next_acquire_time - Clock.now, 0].max
198
+ task.sleep(delay) if delay.positive?
189
199
 
190
- @scheduler_task = nil
191
- }
200
+ # Waits for the task that started the scheduler to yield.
201
+ # See #wait for more details.
202
+ @yield_wait && @yield_notification&.wait
203
+
204
+ resume_waiting
205
+ end
206
+ ensure
207
+ @scheduler = nil
208
+ end
192
209
  end
193
210
 
194
211
  def reschedule?
195
- @scheduler_task &&
212
+ @scheduler &&
196
213
  @waiting.any? &&
197
214
  !limit_blocking?
198
215
  end
199
216
 
200
217
  def reschedule
201
- @scheduler_task.stop
202
- @scheduler_task = nil
218
+ @scheduler.stop
219
+ @scheduler = nil
203
220
 
204
221
  schedule
205
222
  end
metadata CHANGED
@@ -1,85 +1,91 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: async-limiter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bruno Sutic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-16 00:00:00.000000000 Z
11
+ date: 2021-12-30 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
+ - !ruby/object:Gem::Version
19
+ version: '1.27'
20
+ - - "<"
18
21
  - !ruby/object:Gem::Version
19
- version: '1.26'
22
+ version: '3.0'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '1.27'
30
+ - - "<"
25
31
  - !ruby/object:Gem::Version
26
- version: '1.26'
32
+ version: '3.0'
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: async-rspec
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
37
  - - "~>"
32
38
  - !ruby/object:Gem::Version
33
- version: '1.14'
39
+ version: '1.15'
34
40
  type: :development
35
41
  prerelease: false
36
42
  version_requirements: !ruby/object:Gem::Requirement
37
43
  requirements:
38
44
  - - "~>"
39
45
  - !ruby/object:Gem::Version
40
- version: '1.14'
46
+ version: '1.15'
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: rspec
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
51
  - - "~>"
46
52
  - !ruby/object:Gem::Version
47
- version: '3.9'
53
+ version: '3.10'
48
54
  type: :development
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
51
57
  requirements:
52
58
  - - "~>"
53
59
  - !ruby/object:Gem::Version
54
- version: '3.9'
60
+ version: '3.10'
55
61
  - !ruby/object:Gem::Dependency
56
62
  name: rubocop-rspec
57
63
  requirement: !ruby/object:Gem::Requirement
58
64
  requirements:
59
65
  - - "~>"
60
66
  - !ruby/object:Gem::Version
61
- version: '1.43'
67
+ version: '2.0'
62
68
  type: :development
63
69
  prerelease: false
64
70
  version_requirements: !ruby/object:Gem::Requirement
65
71
  requirements:
66
72
  - - "~>"
67
73
  - !ruby/object:Gem::Version
68
- version: '1.43'
74
+ version: '2.0'
69
75
  - !ruby/object:Gem::Dependency
70
76
  name: standard
71
77
  requirement: !ruby/object:Gem::Requirement
72
78
  requirements:
73
79
  - - "~>"
74
80
  - !ruby/object:Gem::Version
75
- version: '0.7'
81
+ version: '0.9'
76
82
  type: :development
77
83
  prerelease: false
78
84
  version_requirements: !ruby/object:Gem::Requirement
79
85
  requirements:
80
86
  - - "~>"
81
87
  - !ruby/object:Gem::Version
82
- version: '0.7'
88
+ version: '0.9'
83
89
  description:
84
90
  email: code@brunosutic.com
85
91
  executables: []
@@ -114,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
120
  - !ruby/object:Gem::Version
115
121
  version: '0'
116
122
  requirements: []
117
- rubygems_version: 3.2.0.rc.1
123
+ rubygems_version: 3.2.3
118
124
  signing_key:
119
125
  specification_version: 4
120
126
  summary: Async limiters