From 7198053a49d39a5c80551fc9147b9c0ab21e75a2 Mon Sep 17 00:00:00 2001 From: kosaki Date: Sun, 9 Sep 2012 12:32:33 +0000 Subject: * lib/thread.rb (Queue#pop): Fixed double registration issue when mutex.sleep is interrupted. [Bug #5258] [ruby-dev:44448] * lib/thread.rb (SizedQueue#push): ditto. * test/thread/test_queue.rb (test_sized_queue_and_wakeup, test_queue_pop_interrupt, test_sized_queue_pop_interrupt, test_sized_queue_push_interrupt): new tests. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36938 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- test/thread/test_queue.rb | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'test/thread') diff --git a/test/thread/test_queue.rb b/test/thread/test_queue.rb index c9b643dbf5..7a4e60e1ae 100644 --- a/test/thread/test_queue.rb +++ b/test/thread/test_queue.rb @@ -56,6 +56,48 @@ class TestQueue < Test::Unit::TestCase assert_equal(1, q.max) end + def test_sized_queue_and_wakeup + sq = SizedQueue.new(1) + sq.push(0) + + t1 = Thread.start { sq.push(1) ; sleep } + + sleep 0.1 until t1.stop? + t1.wakeup + sleep 0.1 until t1.stop? + + t2 = Thread.start { sq.push(2) } + sleep 0.1 until t1.stop? && t2.stop? + + queue_wait = sq.instance_eval{ @queue_wait } + assert_equal(queue_wait.uniq, queue_wait) + end + + def test_queue_pop_interrupt + q = Queue.new + t1 = Thread.new { q.pop } + sleep 0.01 until t1.stop? + t1.kill.join + assert_equal(0, q.num_waiting) + end + + def test_sized_queue_pop_interrupt + q = SizedQueue.new(1) + t1 = Thread.new { q.pop } + sleep 0.01 until t1.stop? + t1.kill.join + assert_equal(0, q.num_waiting) + end + + def test_sized_queue_push_interrupt + q = SizedQueue.new(1) + q.push(1) + t1 = Thread.new { q.push(2) } + sleep 0.01 until t1.stop? + t1.kill.join + assert_equal(0, q.num_waiting) + end + def test_thr_kill bug5343 = '[ruby-core:39634]' Dir.mktmpdir {|d| -- cgit v1.2.3