[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]