[PATCH] SizedQueue#clear does not notify waiting threads in Ruby 1.9.3
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.
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
t2 = Thread.new do
t2.join # Empty queue
t1.join # Deadlock, t1 continues to sleep
#1 [ruby-core:59464] Updated by jsc (Justin Collins) over 3 years ago
- File 0002-Wake-waiting-threads-when-SizedQueue-clear-is-called-2.0.patch 0002-Wake-waiting-threads-when-SizedQueue-clear-is-called-2.0.patch added
Looks like this is also a problem in 2.0.0, although the implementation is a little different. Attaching patch for 2.0.0 too although it's probably clear.
#4 Updated by Anonymous over 3 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
#5 [ruby-core:59835] Updated by jsc (Justin Collins) over 3 years ago
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.
#7 [ruby-core:60626] Updated by nagachika (Tomoyuki Chikanaga) over 3 years ago
- Backport changed from 1.9.3: REQUIRED, 2.0.0: REQUIRED, 2.1: REQUIRED to 1.9.3: REQUIRED, 2.0.0: DONE, 2.1: REQUIRED
1.9.3 and 2.0.0 has different implementation of Queue/SizedQueue from 2.1/trunk.
I partially backported r44595 for test, and commited a patch for ruby_2_0_0 at r44899.