async 2.29.0 → 2.29.1

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: 643f4000360902d473fec7d3c35dfa4d810499a7ee2d419bb6a44e185e4ce9a6
4
- data.tar.gz: fd8150c4df0e9834259c612811856764dde221f3e21a58cb33ae7a9903822f8a
3
+ metadata.gz: f3ecf839913862d1e1638fd14c067e57b4e68a469bc8805d6dd4d568829ab02c
4
+ data.tar.gz: 10a3624e0c564f7d895f77738e88b8a2e0b89ca58fd285488b32bf57509ff3de
5
5
  SHA512:
6
- metadata.gz: 39886cbaf6b6d9a10522956c67d2c5228e22aeefe27104456f3e767441b43b13887ddb41c71e7bc2cffab7956e17117a9e0a8df64d585ecbfe532a87c2f2d592
7
- data.tar.gz: b282710c3ce0fc5db35b7de431fa7d8121c9ca3d2ef4ccb1b0c5cafc26a84162eff01aae53b1b267683d8a0c635a991afae54e4d73d3cf7c2a8b23e2e8d32cdf
6
+ metadata.gz: 4b3ad1290e807941399e29efe94faf04bbc721a4d59b06292abaac482acc27fac25834629a2869a343439594cd8f0576c01af3ccf9bc9f5661885f8fdbf3bcf1
7
+ data.tar.gz: 89c92f9cf32ab403100ea4c00e3d93a2257aac2dd036473ecde04efb5182cffb2d91e76185b7d48f24f9ccceaf3e8dec6609549e96b72225012a964d5d93c207
checksums.yaml.gz.sig CHANGED
Binary file
@@ -43,6 +43,16 @@ module Async
43
43
  condition.wait(mutex)
44
44
  return self.value
45
45
  end
46
+
47
+ # Invalidate this waiter, making it unusable and detectable as abandoned.
48
+ def invalidate!
49
+ self.fiber = nil
50
+ end
51
+
52
+ # Check if this waiter has been invalidated.
53
+ def valid?
54
+ self.fiber&.alive?
55
+ end
46
56
  end
47
57
 
48
58
  # Create a new priority queue.
@@ -64,12 +74,9 @@ module Async
64
74
  @mutex.synchronize do
65
75
  @closed = true
66
76
 
67
- # Signal all waiting fibers with nil, skipping dead ones:
77
+ # Signal all waiting fibers with nil, skipping dead/invalid ones:
68
78
  while waiter = @waiting.pop
69
- if waiter.fiber.alive?
70
- waiter.signal(nil)
71
- end
72
- # Dead waiter discarded, continue to next one.
79
+ waiter.signal(nil)
73
80
  end
74
81
  end
75
82
  end
@@ -105,14 +112,14 @@ module Async
105
112
 
106
113
  @items << item
107
114
 
108
- # Wake up the highest priority waiter if any, skipping dead waiters:
115
+ # Wake up the highest priority waiter if any, skipping dead/invalid waiters:
109
116
  while waiter = @waiting.pop
110
- if waiter.fiber.alive?
117
+ if waiter.valid?
111
118
  value = @items.shift
112
119
  waiter.signal(value)
113
120
  break
114
121
  end
115
- # Dead waiter discarded, try next one.
122
+ # Dead/invalid waiter discarded, try next one.
116
123
  end
117
124
  end
118
125
  end
@@ -133,13 +140,13 @@ module Async
133
140
 
134
141
  @items.concat(items)
135
142
 
136
- # Wake up waiting fibers in priority order, skipping dead waiters:
143
+ # Wake up waiting fibers in priority order, skipping dead/invalid waiters:
137
144
  while !@items.empty? && (waiter = @waiting.pop)
138
- if waiter.fiber.alive?
145
+ if waiter.valid?
139
146
  value = @items.shift
140
147
  waiter.signal(value)
141
148
  end
142
- # Dead waiter discarded, continue to next one.
149
+ # Dead/invalid waiter discarded, continue to next one.
143
150
  end
144
151
  end
145
152
  end
@@ -172,12 +179,16 @@ module Async
172
179
  @sequence += 1
173
180
 
174
181
  condition = ConditionVariable.new
175
- waiter = Waiter.new(Fiber.current, priority, sequence, condition, nil)
176
- @waiting.push(waiter)
177
182
 
178
- # Wait for our specific condition variable to be signaled:
179
- # The mutex is released during wait, reacquired after:
180
- return waiter.wait_for_value(@mutex)
183
+ begin
184
+ waiter = Waiter.new(Fiber.current, priority, sequence, condition, nil)
185
+ @waiting.push(waiter)
186
+
187
+ # Wait for our specific condition variable to be signaled:
188
+ return waiter.wait_for_value(@mutex)
189
+ ensure
190
+ waiter&.invalidate!
191
+ end
181
192
  end
182
193
  end
183
194
 
data/lib/async/version.rb CHANGED
@@ -4,5 +4,5 @@
4
4
  # Copyright, 2017-2025, by Samuel Williams.
5
5
 
6
6
  module Async
7
- VERSION = "2.29.0"
7
+ VERSION = "2.29.1"
8
8
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: async
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.29.0
4
+ version: 2.29.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -209,7 +209,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
209
209
  - !ruby/object:Gem::Version
210
210
  version: '0'
211
211
  requirements: []
212
- rubygems_version: 3.6.9
212
+ rubygems_version: 3.7.0.dev
213
213
  specification_version: 4
214
214
  summary: A concurrency framework for Ruby.
215
215
  test_files: []
metadata.gz.sig CHANGED
Binary file