Issue #17617 has been reported by dazuma (Daniel Azuma).

----------------------------------------
Bug #17617: When a Ractor's incoming port is closed, Ractor.receive_if does not raise Ractor::ClosedError, but instead blocks indefinitely
https://bugs.ruby-lang.org/issues/17617

* Author: dazuma (Daniel Azuma)
* Status: Open
* Priority: Normal
* ruby -v: ruby 3.1.0dev (2021-02-09T13:22:37Z master e7a831de8e) [x86_64-darwin20]
* Backport: 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN
----------------------------------------
If Ractor#close_incoming is called on a Ractor, any pending Ractor.receive call will raise Ractor::ClosedError. However, any pending Ractor.receive_if call will not; instead, it never returns.

```
r1 = Ractor.new do
  Ractor.receive
rescue => e
  e
end
r1.close_incoming
result = r1.take
puts "**** taken: #{result}"  # displays the Ractor::ClosedError

r2 = Ractor.new do
  Ractor.receive_if { true }
  puts "**** never reaches here"
rescue => e
  puts "**** never reaches here"
  e
end
r2.close_incoming
puts "**** hangs here..."
r2.take
puts "**** never reaches here"
```

This was tested against both 3.0.0 and 3.1.0 head, with the same result.

```
% ruby -v
ruby 3.1.0dev (2021-02-09T13:22:37Z master e7a831de8e) [x86_64-darwin20]
```

```
% ruby -v
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-darwin20
```

I have also tried including sleep statements to force the Ractor.receive_if to execute both before and after the Ractor#close_incoming call. The result is the same either way. receive_if hangs regardless of whether the incoming port is already closed when receive_if is invoked, or whether the port is closed while the receive_if is already blocking.




-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>