ruby-changes:4439
From: ko1@a...
Date: Wed, 9 Apr 2008 12:12:45 +0900 (JST)
Subject: [ruby-changes:4439] nobu - Ruby:r15930 (trunk): * test/ruby/test_thread.rb: new tests from Sylvain Joyeux in
nobu 2008-04-09 12:12:03 +0900 (Wed, 09 Apr 2008) New Revision: 15930 Added files: trunk/test/ruby/lbtest.rb Modified files: trunk/ChangeLog trunk/test/ruby/test_thread.rb trunk/version.h Log: * test/ruby/test_thread.rb: new tests from Sylvain Joyeux in [ruby-Patches-19361]. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/version.h?r1=15930&r2=15929&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/ruby/lbtest.rb?revision=15930&view=markup http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/ruby/lbtest.rb?r1=15930&r2=15929&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=15930&r2=15929&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/ruby/test_thread.rb?r1=15930&r2=15929&diff_format=u Index: ChangeLog =================================================================== --- ChangeLog (revision 15929) +++ ChangeLog (revision 15930) @@ -1,3 +1,8 @@ +Wed Apr 9 12:12:01 2008 Nobuyoshi Nakada <nobu@r...> + + * test/ruby/test_thread.rb: new tests from Sylvain Joyeux in + [ruby-Patches-19361]. + Tue Apr 8 21:38:55 2008 Nobuyoshi Nakada <nobu@r...> * thread.c (lock_func): optimized. based on a patch from Sylvain Index: version.h =================================================================== --- version.h (revision 15929) +++ version.h (revision 15930) @@ -1,7 +1,7 @@ #define RUBY_VERSION "1.9.0" -#define RUBY_RELEASE_DATE "2008-04-08" +#define RUBY_RELEASE_DATE "2008-04-09" #define RUBY_VERSION_CODE 190 -#define RUBY_RELEASE_CODE 20080408 +#define RUBY_RELEASE_CODE 20080409 #define RUBY_PATCHLEVEL 0 #define RUBY_VERSION_MAJOR 1 @@ -9,7 +9,7 @@ #define RUBY_VERSION_TEENY 0 #define RUBY_RELEASE_YEAR 2008 #define RUBY_RELEASE_MONTH 4 -#define RUBY_RELEASE_DAY 8 +#define RUBY_RELEASE_DAY 9 #ifdef RUBY_EXTERN RUBY_EXTERN const char ruby_version[]; Index: test/ruby/lbtest.rb =================================================================== --- test/ruby/lbtest.rb (revision 0) +++ test/ruby/lbtest.rb (revision 15930) @@ -0,0 +1,48 @@ +require 'thread' + +class LocalBarrier + def initialize(n) + @wait = Queue.new + @done = Queue.new + @keeper = begin_keeper(n) + end + + def sync + @done.push(true) + @wait.pop + end + + def join + @keeper.join + end + + private + def begin_keeper(n) + Thread.start do + n.times do + @done.pop + end + n.times do + @wait.push(true) + end + end + end +end + +n = 10 + +lb = LocalBarrier.new(n) + +(n - 1).times do |i| + Thread.start do + sleep((rand(n) + 1) / 10.0) + puts "#{i}: done" + lb.sync + puts "#{i}: cont" + end +end + +lb.sync +puts "#{n-1}: cone" + +puts "exit." Property changes on: test/ruby/lbtest.rb ___________________________________________________________________ Name: svn:eol-style + LF Name: svn:keywords + Author Id Revision Index: test/ruby/test_thread.rb =================================================================== --- test/ruby/test_thread.rb (revision 15929) +++ test/ruby/test_thread.rb (revision 15930) @@ -1,6 +1,15 @@ require 'test/unit' +require 'thread' class TestThread < Test::Unit::TestCase + class Thread < ::Thread + def self.new(*) + th = super + th.abort_on_exception = true + th + end + end + def test_mutex_synchronize m = Mutex.new r = 0 @@ -20,6 +29,74 @@ } assert_equal(max * max * max, r) 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 + + locked = false + thread = Thread.new do + Thread.current.abort_on_exception = false + mutex.synchronize do + begin + condvar.wait(mutex) + rescue Exception + locked = mutex.locked? + raise + end + end + end + + until thread.stop? + sleep(0.1) + end + + thread.raise Interrupt, "interrupt a dead condition variable" + assert_raises(Interrupt) { thread.value } + assert(locked) + end + + def test_local_barrier + dir = File.dirname(__FILE__) + lbtest = File.join(dir, "lbtest.rb") + $:.unshift File.join(File.dirname(dir), 'ruby') + require 'envutil' + $:.shift + 10.times { + result = `#{EnvUtil.rubybin} #{lbtest}` + assert(!$?.coredump?, '[ruby-dev:30653]') + assert_equal("exit.", result[/.*\Z/], '[ruby-dev:30653]') + } + end end class TestThreadGroup < Test::Unit::TestCase -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/