From 6175ca03be6d0d51359f9017123708987d0f5eb7 Mon Sep 17 00:00:00 2001 From: shyouhei Date: Wed, 15 Aug 2007 23:23:39 +0000 Subject: add tag v1_8_5_91 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/tags/v1_8_5_91@13046 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ruby_1_8_5/test/monitor/test_monitor.rb | 161 ++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 ruby_1_8_5/test/monitor/test_monitor.rb (limited to 'ruby_1_8_5/test/monitor/test_monitor.rb') diff --git a/ruby_1_8_5/test/monitor/test_monitor.rb b/ruby_1_8_5/test/monitor/test_monitor.rb new file mode 100644 index 0000000000..b539cb3cca --- /dev/null +++ b/ruby_1_8_5/test/monitor/test_monitor.rb @@ -0,0 +1,161 @@ +require "monitor" +require "thread" + +require "test/unit" + +class TestMonitor < Test::Unit::TestCase + def setup + @monitor = Monitor.new + end + + def test_enter + ary = [] + queue = Queue.new + th = Thread.start { + queue.pop + @monitor.enter + for i in 6 .. 10 + ary.push(i) + Thread.pass + end + @monitor.exit + } + @monitor.enter + queue.enq(nil) + for i in 1 .. 5 + ary.push(i) + Thread.pass + end + @monitor.exit + th.join + assert_equal((1..10).to_a, ary) + end + + def test_synchronize + ary = [] + queue = Queue.new + th = Thread.start { + queue.pop + @monitor.synchronize do + for i in 6 .. 10 + ary.push(i) + Thread.pass + end + end + } + @monitor.synchronize do + queue.enq(nil) + for i in 1 .. 5 + ary.push(i) + Thread.pass + end + end + th.join + assert_equal((1..10).to_a, ary) + end + + def test_try_enter + queue1 = Queue.new + queue2 = Queue.new + th = Thread.start { + queue1.deq + @monitor.enter + queue2.enq(nil) + queue1.deq + @monitor.exit + queue2.enq(nil) + } + assert_equal(true, @monitor.try_enter) + @monitor.exit + queue1.enq(nil) + queue2.deq + assert_equal(false, @monitor.try_enter) + queue1.enq(nil) + queue2.deq + assert_equal(true, @monitor.try_enter) + end + + def test_cond + cond = @monitor.new_cond + + a = "foo" + queue1 = Queue.new + Thread.start do + queue1.deq + @monitor.synchronize do + a = "bar" + cond.signal + end + end + @monitor.synchronize do + queue1.enq(nil) + assert_equal("foo", a) + result1 = cond.wait + assert_equal(true, result1) + assert_equal("bar", a) + end + + b = "foo" + queue2 = Queue.new + Thread.start do + queue2.deq + @monitor.synchronize do + b = "bar" + cond.signal + end + end + @monitor.synchronize do + queue2.enq(nil) + assert_equal("foo", b) + result2 = cond.wait(0.1) + assert_equal(true, result2) + assert_equal("bar", b) + end + + c = "foo" + queue3 = Queue.new + Thread.start do + queue3.deq + @monitor.synchronize do + c = "bar" + cond.signal + end + end + @monitor.synchronize do + assert_equal("foo", c) + result3 = cond.wait(0.1) + assert_equal(false, result3) + assert_equal("foo", c) + queue3.enq(nil) + result4 = cond.wait + assert_equal(true, result4) + assert_equal("bar", c) + end + +# d = "foo" +# cumber_thread = Thread.start { +# loop do +# @monitor.synchronize do +# d = "foo" +# end +# end +# } +# queue3 = Queue.new +# Thread.start do +# queue3.pop +# @monitor.synchronize do +# d = "bar" +# cond.signal +# end +# end +# @monitor.synchronize do +# queue3.enq(nil) +# assert_equal("foo", d) +# result5 = cond.wait +# assert_equal(true, result5) +# # this thread has priority over cumber_thread +# assert_equal("bar", d) +# end +# cumber_thread.kill + end +end -- cgit v1.2.3