Bug #9342

[PATCH] SizedQueue#clear does not notify waiting threads in Ruby 1.9.3

Added by Justin Collins about 1 year ago. Updated about 1 year ago.

[ruby-core:59462]
Status:Closed
Priority:Normal
Assignee:Koichi Sasada
ruby -v:ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-darwin11.4.2] Backport:1.9.3: DONE, 2.0.0: DONE, 2.1: DONE

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

0001-Wake-waiting-threads-when-SizedQueue-clear-is-called.patch Magnifier (1.73 KB) Justin Collins, 01/02/2014 02:00 PM

0002-Wake-waiting-threads-when-SizedQueue-clear-is-called-2.0.patch Magnifier - patch for Ruby 2.0.0 (769 Bytes) Justin Collins, 01/02/2014 03:53 PM

Associated revisions

Revision 44595
Added by glass about 1 year ago

  • ext/thread/thread.c (rb_szqueue_clear): notify SZQUEUE_WAITERS
    on SizedQueue#clear. [Bug #9342]

  • test/thread/test_queue.rb: add test. the patch is from
    Justin Collins.

Revision 44595
Added by glass about 1 year ago

  • ext/thread/thread.c (rb_szqueue_clear): notify SZQUEUE_WAITERS
    on SizedQueue#clear. [Bug #9342]

  • test/thread/test_queue.rb: add test. the patch is from
    Justin Collins.

History

#1 Updated by Justin Collins about 1 year ago

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.

#2 Updated by Eric Wong about 1 year ago

I agree this is a problem. This also affects 2.1.0 and trunk (where
SizedQueue is C).

#3 Updated by Koichi Sasada about 1 year ago

  • Category set to ext
  • Assignee set to Koichi Sasada
  • Target version set to current: 2.2.0

#4 Updated by Anonymous about 1 year 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. [Bug #9342]

  • test/thread/test_queue.rb: add test. the patch is from
    Justin Collins.

#5 Updated by Justin Collins about 1 year 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.

#6 Updated by Usaku NAKAMURA about 1 year 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

#7 Updated by Tomoyuki Chikanaga about 1 year 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.

#8 Updated by Usaku NAKAMURA about 1 year 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!

#9 Updated by Yui NARUSE about 1 year 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.

Also available in: Atom PDF