Bug #9342
closed[PATCH] SizedQueue#clear does not notify waiting threads in Ruby 1.9.3
Description
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
Updated by jsc (Justin Collins) almost 11 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.
Updated by normalperson (Eric Wong) almost 11 years ago
I agree this is a problem. This also affects 2.1.0 and trunk (where
SizedQueue is C).
Updated by ko1 (Koichi Sasada) almost 11 years ago
- Category set to ext
- Assignee set to ko1 (Koichi Sasada)
- Target version set to 2.2.0
Updated by Anonymous almost 11 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
Applied in changeset r44595.
-
ext/thread/thread.c (rb_szqueue_clear): notify SZQUEUE_WAITERS
on SizedQueue#clear. [ruby-core:59462] [Bug #9342] -
test/thread/test_queue.rb: add test. the patch is from
Justin Collins.
Updated by jsc (Justin Collins) almost 11 years ago
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.
Updated by usa (Usaku NAKAMURA) almost 11 years ago
- Backport changed from 1.9.3: UNKNOWN, 2.0.0: UNKNOWN, 2.1: UNKNOWN to 1.9.3: REQUIRED, 2.0.0: REQUIRED, 2.1: REQUIRED
Updated by nagachika (Tomoyuki Chikanaga) almost 11 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.
Updated by usa (Usaku NAKAMURA) almost 11 years ago
- Backport changed from 1.9.3: REQUIRED, 2.0.0: DONE, 2.1: REQUIRED to 1.9.3: DONE, 2.0.0: DONE, 2.1: REQUIRED
Commited to ruby_1_9_3 at r44932.
Thank you, Justin!
Updated by naruse (Yui NARUSE) almost 11 years ago
- Backport changed from 1.9.3: DONE, 2.0.0: DONE, 2.1: REQUIRED to 1.9.3: DONE, 2.0.0: DONE, 2.1: DONE
r45104.