diff options
author | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-03-16 11:31:00 +0000 |
---|---|---|
committer | shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-03-16 11:31:00 +0000 |
commit | e27ef85f5c8fdaf8d1276d6a4d48bd46bc502596 (patch) | |
tree | 007952b0ff9087e06bff025d51773a427adc634e /test | |
parent | 6f405ca6a67573d84df65e9792b4ec0b3d90f5c0 (diff) |
* merge -r 12066:12069
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_6@12077 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test')
-rw-r--r-- | test/thread/test_thread.rb | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/test/thread/test_thread.rb b/test/thread/test_thread.rb new file mode 100644 index 0000000000..abdcebffcf --- /dev/null +++ b/test/thread/test_thread.rb @@ -0,0 +1,67 @@ +require 'thread' +require 'test/unit' + +class TC_Thread < Test::Unit::TestCase + def setup + Thread.abort_on_exception = true + end + def teardown + Thread.abort_on_exception = false + end + def test_condvar + mutex = Mutex.new + condvar = ConditionVariable.new + result = [] + mutex.synchronize do + t = Thread.new do + mutex.synchronize do + result << 1 + condvar.signal + end + end + + result << 0 + condvar.wait(mutex) + result << 2 + t.join + end + assert_equal([0, 1, 2], result) + end + + def test_condvar_wait_not_owner + mutex = Mutex.new + condvar = ConditionVariable.new + + assert_raises(ThreadError) { condvar.wait(mutex) } + end + + def test_condvar_wait_exception_handling + # Calling wait in the only thread running should raise a ThreadError of + # 'stopping only thread' + mutex = Mutex.new + condvar = ConditionVariable.new + + Thread.abort_on_exception = false + + locked = false + thread = Thread.new do + mutex.synchronize do + begin + condvar.wait(mutex) + rescue Exception + locked = mutex.locked? + raise + end + end + end + + while !thread.stop? + sleep(0.1) + end + + thread.raise Interrupt, "interrupt a dead condition variable" + assert_raises(Interrupt) { thread.value } + assert(locked) + end +end + |