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/