ruby-changes:18623
From: kosaki <ko1@a...>
Date: Tue, 25 Jan 2011 03:27:59 +0900 (JST)
Subject: [ruby-changes:18623] Ruby:r30647 (trunk): * test/ruby/test_thread.rb: Added various ConditionVariable tests.
kosaki 2011-01-25 03:25:20 +0900 (Tue, 25 Jan 2011) New Revision: 30647 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=30647 Log: * test/ruby/test_thread.rb: Added various ConditionVariable tests. Modified files: trunk/ChangeLog trunk/test/ruby/test_thread.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 30646) +++ ChangeLog (revision 30647) @@ -1,3 +1,7 @@ +Tue Jan 25 03:24:28 2011 KOSAKI Motohiro <kosaki.motohiro@g...> + + * test/ruby/test_thread.rb: Added various ConditionVariable tests. + Mon Jan 24 22:26:33 2011 KOSAKI Motohiro <kosaki.motohiro@g...> * object.c (rb_str_to_dbl): Fix again. use rb_str_tmp_new() Index: test/ruby/test_thread.rb =================================================================== --- test/ruby/test_thread.rb (revision 30646) +++ test/ruby/test_thread.rb (revision 30647) @@ -102,6 +102,120 @@ assert(locked) end + def test_condvar_wait_and_broadcast + nr_threads = 3 + threads = Array.new + mutex = Mutex.new + condvar = ConditionVariable.new + result = [] + + nr_threads.times do |i| + threads[i] = Thread.new do + mutex.synchronize do + result << "C1" + condvar.wait mutex + result << "C2" + end + end + end + sleep 0.1 + mutex.synchronize do + result << "P1" + condvar.broadcast + result << "P2" + end + nr_threads.times do |i| + threads[i].join + end + + assert_equal ["C1", "C1", "C1", "P1", "P2", "C2", "C2", "C2"], result + end + +# Hmm.. don't we have a way of catch fatal exception? +# +# def test_cv_wait_deadlock +# mutex = Mutex.new +# cv = ConditionVariable.new +# +# assert_raises(fatal) { +# mutex.lock +# cv.wait mutex +# mutex.unlock +# } +# end + + def test_condvar_wait_deadlock_2 + nr_threads = 3 + threads = Array.new + mutex = Mutex.new + condvar = ConditionVariable.new + result = [] + + nr_threads.times do |i| + if (i != 0) + mutex.unlock + end + threads[i] = Thread.new do + mutex.synchronize do + condvar.wait mutex + end + end + mutex.lock + end + + assert_raise(Timeout::Error) do + Timeout.timeout(0.1) { condvar.wait mutex } + end + mutex.unlock rescue + threads[i].each.join + end + + def test_condvar_timed_wait + mutex = Mutex.new + condvar = ConditionVariable.new + timeout = 0.3 + locked = false + + t0 = Time.now + mutex.synchronize do + begin + condvar.wait(mutex, timeout) + ensure + locked = mutex.locked? + end + end + t1 = Time.now + t = t1-t0 + + assert_block { timeout*0.9 < t && t < timeout*1.1 } + assert(locked) + end + + def test_condvar_nolock + mutex = Mutex.new + condvar = ConditionVariable.new + + assert_raise(ThreadError) { condvar.wait(mutex) } + end + + def test_condvar_nolock_2 + mutex = Mutex.new + condvar = ConditionVariable.new + + thr = Thread.new do + assert_raise(ThreadError) {condvar.wait(mutex)} + end.join + end + + def test_condvar_nolock_2 + mutex = Mutex.new + condvar = ConditionVariable.new + + thr = Thread.new do + assert_raise(ThreadError) {condvar.wait(mutex, 0.1)} + end.join + end + def test_local_barrier dir = File.dirname(__FILE__) lbtest = File.join(dir, "lbtest.rb") -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/