summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorshyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-03-16 11:31:00 +0000
committershyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-03-16 11:31:00 +0000
commite27ef85f5c8fdaf8d1276d6a4d48bd46bc502596 (patch)
tree007952b0ff9087e06bff025d51773a427adc634e /test
parent6f405ca6a67573d84df65e9792b4ec0b3d90f5c0 (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.rb67
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 0000000..abdcebf
--- /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
+