async-limiter 1.3.1 → 1.5.3

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: 5b8fe52d0adb39187c467e5a9195df3fc974cdad0c66e20ca4fbb8f2331e108a
4
- data.tar.gz: 65aee35742f72694b2a1c1e4d34b41ee0d6e03eedc0f82029dbac31d042a1ad1
3
+ metadata.gz: dc95096df427d6b99502f8eb6f17f3cc0ec70598e093fd1d8aae5db50324d668
4
+ data.tar.gz: 21dfb9413922d3b20f1ee3f4ac9dbfd1ecdc5c2e08d12e9760c4b347cd941c0a
5
5
  SHA512:
6
- metadata.gz: 575d83be39d544535c060e113934f147e94a81f97423b3207036610edc7b8e5a230dd46301e7e20253cbd477cf1ef2ba8ead19dc610a465665c10238c5357090
7
- data.tar.gz: 033f5f5b7063c908fb250198789e053c02b512e9c04e1d56fe8ac01486c93030df7dc7046cf4923cdb2f3282c8f1ad066f97ed8319f6061ba9f1a5a275b9abda
6
+ metadata.gz: b3c074890ffa3befca024121f8988222539991ed43a99b99ccdcf2855b7e8219151ed118a2d549b490ad4992a2801c2af7e8fb43f315978176e1dab8db9657ec
7
+ data.tar.gz: 44ddac8caf55fa453604e57565e66c8bccd708cd710c76f65ad13f2408daa5442e3596dde2cd45e7a5bd33ed90e034a226c30cc98f85f57196e34059f7db4a7a
@@ -30,8 +30,10 @@ module Async
30
30
  end
31
31
  end
32
32
 
33
- def sync(*queue_args, &block)
34
- acquire(*queue_args, &block)
33
+ def sync(*queue_args)
34
+ acquire(*queue_args) do
35
+ yield(@parent || Task.current)
36
+ end
35
37
  end
36
38
 
37
39
  def acquire(*queue_args)
@@ -27,8 +27,10 @@ module Async
27
27
  end
28
28
  end
29
29
 
30
- def sync(*queue_args, &block)
31
- acquire(*queue_args, &block)
30
+ def sync(*queue_args)
31
+ acquire(*queue_args) do
32
+ yield(@parent || Task.current)
33
+ end
32
34
  end
33
35
 
34
36
  def acquire
@@ -1,5 +1,5 @@
1
1
  module Async
2
2
  module Limiter
3
- VERSION = "1.3.1"
3
+ VERSION = "1.5.3"
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
@@ -56,8 +59,10 @@ module Async
56
59
  end
57
60
  end
58
61
 
59
- def sync(*queue_args, &block)
60
- acquire(*queue_args, &block)
62
+ def sync(*queue_args)
63
+ acquire(*queue_args) do
64
+ yield Task.current
65
+ end
61
66
  end
62
67
 
63
68
  def acquire(*queue_args)
@@ -156,7 +161,14 @@ module Async
156
161
  # slipping in operations before other waiting fibers get resumed.
157
162
  if blocking? || @waiting.any?
158
163
  @waiting.push(fiber, *queue_args) # queue_args used for custom queues
164
+ @yield_wait = true
159
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
+
160
172
  loop do
161
173
  Task.yield # run this line at least once
162
174
  break unless blocking?
@@ -168,34 +180,43 @@ module Async
168
180
  end
169
181
 
170
182
  def schedule?
171
- @scheduler_task.nil? &&
183
+ @scheduler.nil? &&
172
184
  @waiting.any? &&
173
185
  !limit_blocking?
174
186
  end
175
187
 
176
188
  # Schedule resuming waiting tasks.
177
189
  def schedule(parent: @parent || Task.current)
178
- @scheduler_task ||=
179
- parent.async { |task|
180
- while @waiting.any? && !limit_blocking?
181
- delay = [next_acquire_time - Async::Clock.now, 0].max
182
- task.sleep(delay) if delay.positive?
183
- resume_waiting
184
- 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}.")
185
195
 
186
- @scheduler_task = nil
187
- }
196
+ while @waiting.any? && !limit_blocking?
197
+ delay = [next_acquire_time - Clock.now, 0].max
198
+ task.sleep(delay) if delay.positive?
199
+
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
188
209
  end
189
210
 
190
211
  def reschedule?
191
- @scheduler_task &&
212
+ @scheduler &&
192
213
  @waiting.any? &&
193
214
  !limit_blocking?
194
215
  end
195
216
 
196
217
  def reschedule
197
- @scheduler_task.stop
198
- @scheduler_task = nil
218
+ @scheduler.stop
219
+ @scheduler = nil
199
220
 
200
221
  schedule
201
222
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: async-limiter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.5.3
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-11 00:00:00.000000000 Z
11
+ date: 2021-01-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async
@@ -16,70 +16,70 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.26'
19
+ version: '1.27'
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
- version: '1.26'
26
+ version: '1.27'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: async-rspec
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.14'
33
+ version: '1.15'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.14'
40
+ version: '1.15'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '3.9'
47
+ version: '3.10'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '3.9'
54
+ version: '3.10'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rubocop-rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '1.43'
61
+ version: '2.0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '1.43'
68
+ version: '2.0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: standard
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0.7'
75
+ version: '0.9'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0.7'
82
+ version: '0.9'
83
83
  description:
84
84
  email: code@brunosutic.com
85
85
  executables: []
@@ -114,7 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
114
  - !ruby/object:Gem::Version
115
115
  version: '0'
116
116
  requirements: []
117
- rubygems_version: 3.2.0.rc.1
117
+ rubygems_version: 3.2.3
118
118
  signing_key:
119
119
  specification_version: 4
120
120
  summary: Async limiters