Issue #17357 has been updated by marcandre (Marc-Andre Lafortune).


Final note:
- no particular justification was given for choosing not to differentiate `nil` and closed result at the time.
- many APIs were proposed (raising, or keyword parameters). Keyword parameters were a "no" because they were slow. I imagine that is no longer the case.

Let's make Ruby safe.

----------------------------------------
Feature #17357: `Queue#pop` should have a block form for clsoed queues
https://bugs.ruby-lang.org/issues/17357#change-89136

* Author: marcandre (Marc-Andre Lafortune)
* Status: Open
* Priority: Normal
----------------------------------------
It is currently difficult to reliably distinguish a `nil` value in a queue from the `nil` that is returned when a Queue is closed:

```ruby
n = 100_000
result = []
t2 = Thread.new { n.times { Thread.pass }} # to make things less predictable
n.times.count do
  q = Queue.new
  t = Thread.new { q.pop; result << q.closed? }
  q << nil
  q.close
  t.join
end
puts result.count(true) # => some number usually > 9990 and < 10000
````

To be completely sure, one needs a Mutex or wrap/unwrap `nil` values.

`Queue#pop` should offer a surefire way to handle closed queues. I propose that an optional block be called in this case:

```ruby
q = Queue.new.close
q.pop # => nil
q.pop { :closed }  # => :closed
````

Proposed PR: https://github.com/ruby/ruby/pull/3830



-- 
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>