ractor-pool 0.3.0 → 0.3.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: b97336e3bda02791d66cbef83761b58ff599afca2e58698bd79e7aa5bdedc497
4
- data.tar.gz: 77b0ff65e53978436edc7701c204415709092f96a71f1c834e7ce719c75fc3d4
3
+ metadata.gz: 13aa15dab296025cc8fa8348a4477bd8afd2db09b24ea4e13c43a17cca976cd2
4
+ data.tar.gz: b99432e86a0e93b69aa84867b869a0502469b402a297698599175442987cc23f
5
5
  SHA512:
6
- metadata.gz: acdd99e1c5c20f0d628353abe9682a9283c1d60d5b5f1247d366c08e91db3dc19e62797a8d3347fd49c8498e1896e57711637a0cea3c05359f4aa300f3f73eee
7
- data.tar.gz: 5cf2b4e221ec273c5ed038c256d36e4b29f58619eee6d7412e68d498288e593373a874118b6b4f58e83c8a20009c800e3000d5aa31dc88cc7b6fc5ed277c33ed
6
+ metadata.gz: 8f85b3c281484b9daf22e6e0fe2c195ca4a5a67640e3913d70f93cd109c022e3138cbae924477de09e2400c552b9b4c19eb386cf9b5b3479ec6bf60e382cbb4d
7
+ data.tar.gz: 6101a788de91cbe8f681cfa3c3c05556154061f0f96910e2474c1b083b5c283455d2ee1c525d30f8e73785148ad6392dbf1464f578cdb8b07670718b911bfba5
@@ -6,6 +6,7 @@ steps:
6
6
  - bundle exec rake
7
7
 
8
8
  - label: ":ruby: Ruby head"
9
+ soft_fail: true
9
10
  image: "rubylang/ruby:master-dev"
10
11
  commands:
11
12
  - apt-get update && apt-get install -y libyaml-dev
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.3.1] - 2026-05-12
4
+
5
+ - Fix `result_port` race condition in single-worker shutdown
6
+
3
7
  ## [0.3.0] - 2026-05-08
4
8
 
5
9
  - Replace state atom with separate `@in_flight` and `@shutdown` atoms
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class RactorPool
4
- VERSION = "0.3.0"
4
+ VERSION = "0.3.1"
5
5
  end
data/lib/ractor-pool.rb CHANGED
@@ -35,7 +35,7 @@ Warning.ignore(/Ractor API is experimental/, __FILE__)
35
35
  #
36
36
  # p counter.value #=> 10
37
37
  #
38
- # @see https://docs.ruby-lang.org/en/master/ractor_md.html Ractor Guide
38
+ # @see https://docs.ruby-lang.org/en/master/language/ractor_md.html Ractor Guide
39
39
  # @see https://docs.ruby-lang.org/en/master/Ractor.html Ractor API
40
40
  # @see https://docs.ruby-lang.org/en/master/Ractor/Port.html Ractor::Port API
41
41
  # @see https://github.com/joshuay03/atomic-ruby atomic-ruby gem
@@ -62,8 +62,8 @@ class RactorPool
62
62
  # @rbs @error_port: Ractor::Port?
63
63
  # @rbs @coordinator: Ractor?
64
64
  # @rbs @workers: Array[Ractor]
65
- # @rbs @error_collector: Thread?
66
65
  # @rbs @collector: Thread?
66
+ # @rbs @error_collector: Thread?
67
67
 
68
68
  # Creates a new RactorPool with the specified number of workers.
69
69
  #
@@ -107,8 +107,8 @@ class RactorPool
107
107
  @error_port = Ractor::Port.new unless on_error
108
108
  @coordinator = start_coordinator if size > 1
109
109
  @workers = start_workers
110
- @error_collector = start_error_collector
111
110
  @collector = start_collector
111
+ @error_collector = start_error_collector
112
112
  end
113
113
 
114
114
  # Queues a work item to be processed by an available worker.
@@ -170,10 +170,15 @@ class RactorPool
170
170
 
171
171
  Thread.pass until @in_flight.value.zero?
172
172
 
173
- @coordinator&.send(SHUTDOWN, move: true) ||
174
- (@workers.first.send(SHUTDOWN, move: true) && @result_port&.send(SHUTDOWN, move: true))
175
- @workers.each(&:join)
176
- @coordinator&.join
173
+ if @coordinator
174
+ @coordinator.send(SHUTDOWN, move: true)
175
+ @workers.each(&:join)
176
+ @coordinator.join
177
+ else
178
+ @workers.first.send(SHUTDOWN, move: true)
179
+ @workers.each(&:join)
180
+ @result_port&.send(SHUTDOWN, move: true)
181
+ end
177
182
  @error_port&.send(SHUTDOWN, move: true)
178
183
  @error_collector&.join
179
184
  @collector&.join
@@ -261,39 +266,39 @@ class RactorPool
261
266
  end
262
267
 
263
268
  # @rbs () -> Thread?
264
- def start_error_collector
265
- return if @on_error
269
+ def start_collector
270
+ return unless @result_handler
266
271
 
267
- thread_name = String.new("#{self.class.name} error collector thread")
272
+ thread_name = String.new("#{self.class.name} collector thread")
268
273
  thread_name << " for #{@name}" if @name
269
274
 
270
- Thread.new(@error_port, thread_name) do |error_port, name|
275
+ Thread.new(@result_port, @result_handler, thread_name) do |result_port, result_handler, name|
271
276
  Thread.current.name = name
272
277
 
273
278
  loop do
274
- message = error_port.receive
275
- break if message == SHUTDOWN
279
+ result = result_port.receive
280
+ break if result == SHUTDOWN
276
281
 
277
- warn message
282
+ result_handler.call(result)
278
283
  end
279
284
  end
280
285
  end
281
286
 
282
287
  # @rbs () -> Thread?
283
- def start_collector
284
- return unless @result_handler
288
+ def start_error_collector
289
+ return if @on_error
285
290
 
286
- thread_name = String.new("#{self.class.name} collector thread")
291
+ thread_name = String.new("#{self.class.name} error collector thread")
287
292
  thread_name << " for #{@name}" if @name
288
293
 
289
- Thread.new(@result_port, @result_handler, thread_name) do |result_port, result_handler, name|
294
+ Thread.new(@error_port, thread_name) do |error_port, name|
290
295
  Thread.current.name = name
291
296
 
292
297
  loop do
293
- result = result_port.receive
294
- break if result == SHUTDOWN
298
+ message = error_port.receive
299
+ break if message == SHUTDOWN
295
300
 
296
- result_handler.call(result)
301
+ warn message
297
302
  end
298
303
  end
299
304
  end
@@ -29,7 +29,7 @@
29
29
  #
30
30
  # p counter.value #=> 10
31
31
  #
32
- # @see https://docs.ruby-lang.org/en/master/ractor_md.html Ractor Guide
32
+ # @see https://docs.ruby-lang.org/en/master/language/ractor_md.html Ractor Guide
33
33
  # @see https://docs.ruby-lang.org/en/master/Ractor.html Ractor API
34
34
  # @see https://docs.ruby-lang.org/en/master/Ractor/Port.html Ractor::Port API
35
35
  # @see https://github.com/joshuay03/atomic-ruby atomic-ruby gem
@@ -44,10 +44,10 @@ class RactorPool
44
44
 
45
45
  SHUTDOWN: ::Symbol
46
46
 
47
- @collector: Thread?
48
-
49
47
  @error_collector: Thread?
50
48
 
49
+ @collector: Thread?
50
+
51
51
  @workers: Array[Ractor]
52
52
 
53
53
  @coordinator: Ractor?
@@ -137,8 +137,8 @@ class RactorPool
137
137
  def start_workers: () -> Array[Ractor]
138
138
 
139
139
  # @rbs () -> Thread?
140
- def start_error_collector: () -> Thread?
140
+ def start_collector: () -> Thread?
141
141
 
142
142
  # @rbs () -> Thread?
143
- def start_collector: () -> Thread?
143
+ def start_error_collector: () -> Thread?
144
144
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ractor-pool
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Young
@@ -73,7 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
73
73
  - !ruby/object:Gem::Version
74
74
  version: '0'
75
75
  requirements: []
76
- rubygems_version: 4.0.6
76
+ rubygems_version: 4.0.10
77
77
  specification_version: 4
78
78
  summary: A thread-safe, lock-free pool of Ractor workers with a coordinator pattern
79
79
  for distributing work