diff options
author | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-01-28 02:25:38 +0000 |
---|---|---|
committer | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-01-28 02:25:38 +0000 |
commit | 22955e9b4d5e853f8f7aaef23c8ccb9df34af2ec (patch) | |
tree | e9967398de4a8af8335fc8df041b93b91dab5dc2 | |
parent | be007d6eae988b657f639446ba6ff2bf0ddefa72 (diff) |
merges r30647,r30650 and r30651 from trunk into ruby_1_9_2.
--
* test/ruby/test_thread.rb: Added various ConditionVariable tests.
--
* test/ruby/test_thread.rb (TestThread#test_condvar_nolock_2): get rid of method redefined.
--
* test/ruby/test_thread.rb: remove unused variables.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_2@30693 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | test/ruby/test_thread.rb | 113 | ||||
-rw-r--r-- | version.h | 2 |
3 files changed, 127 insertions, 1 deletions
@@ -1,3 +1,16 @@ +Tue Jan 25 07:48:22 2011 Kazuhiro NISHIYAMA <zn@mbf.nifty.com> + + * test/ruby/test_thread.rb: remove unused variables. + +Tue Jan 25 07:45:44 2011 Kazuhiro NISHIYAMA <zn@mbf.nifty.com> + + * test/ruby/test_thread.rb (TestThread#test_condvar_nolock_2): get + rid of method redefined. + +Tue Jan 25 03:24:28 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com> + + * test/ruby/test_thread.rb: Added various ConditionVariable tests. + Mon Jan 24 21:04:45 2011 Nobuyoshi Nakada <nobu@ruby-lang.org> * error.c (rb_invalid_str): prevent intermediate variable from GC. diff --git a/test/ruby/test_thread.rb b/test/ruby/test_thread.rb index 3c10cce3c3..b8c507a73e 100644 --- a/test/ruby/test_thread.rb +++ b/test/ruby/test_thread.rb @@ -102,6 +102,119 @@ class TestThread < Test::Unit::TestCase 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 + + 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 + + Thread.new do + assert_raise(ThreadError) {condvar.wait(mutex)} + end.join + end + + def test_condvar_nolock_3 + mutex = Mutex.new + condvar = ConditionVariable.new + + 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") @@ -1,5 +1,5 @@ #define RUBY_VERSION "1.9.2" -#define RUBY_PATCHLEVEL 170 +#define RUBY_PATCHLEVEL 171 #define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MINOR 9 #define RUBY_VERSION_TEENY 1 |