Issue #9342 has been updated by Justin Collins.


Thank you!

As far as I can tell, SizedQueue#clear has never notified waiting threads since it was introduced in Ruby 1.4. Perhaps something with green threads allowed it to work anyway? It is definitely an issue in 1.9.3 and later.

----------------------------------------
Bug #9342: [PATCH] SizedQueue#clear does not notify waiting threads in Ruby 1.9.3
https://bugs.ruby-lang.org/issues/9342#change-44403

* Author: Justin Collins
* Status: Closed
* Priority: Normal
* Assignee: Koichi Sasada
* Category: ext
* Target version: current: 2.2.0
* ruby -v: ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-darwin11.4.2]
* Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN, 2.1: UNKNOWN
----------------------------------------
In Ruby 1.9.3, when SizedQueue#clear is called, it empties the queue but does not notify waiting threads that the queue is empty. This typically leads to deadlock when the queue is full.

For example:

sq = SizedQueue.new(1)
sq << 1  # Fill queue

t1 = Thread.new do
  sq << 1  # Attempt to add another item to queue, fail and go to sleep waiting
end

t2 = Thread.new do
  Thread.pass
  sq.clear
end

t2.join # Empty queue
t1.join # Deadlock, t1 continues to sleep


---Files--------------------------------
0001-Wake-waiting-threads-when-SizedQueue-clear-is-called.patch (1.73 KB)
0002-Wake-waiting-threads-when-SizedQueue-clear-is-called-2.0.patch (769 Bytes)


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