From: "H.Yamamoto" Date: 2004-05-25T14:46:08+09:00 Subject: [ruby-dev:23615] console freezed on test/drb/drbtest.rb : test_06_timeout (bcc32) 山本です。 bcc32だと test_06_timeout でフリーズするので、調べてみました。(mswin32では正常に実行されます) 下のパッチをデバッグ用に当てたあと、 Index: drbtest.rb =================================================================== RCS file: /ruby/ruby/test/drb/drbtest.rb,v retrieving revision 1.9 diff -u -w -b -p -r1.9 drbtest.rb --- drbtest.rb 8 Apr 2004 11:25:24 -0000 1.9 +++ drbtest.rb 25 May 2004 05:24:06 -0000 @@ -44,9 +44,12 @@ class Onecky @num.to_i end - def sleep(n) + def sleep(n, id) + p "#{id} in" Kernel.sleep(n) + p "#{id} out" to_i +# raise "dummy" end end @@ -161,10 +164,16 @@ module DRbCore def test_06_timeout ten = Onecky.new(10) assert_raises(TimeoutError) do - @there.do_timeout(ten) + @there.do_timeout(ten, 0) end assert_raises(TimeoutError) do - @there.do_timeout(ten) + @there.do_timeout(ten, 1) + end + assert_raises(TimeoutError) do + @there.do_timeout(ten, 2) + end + assert_raises(TimeoutError) do + @there.do_timeout(ten, 3) end end Index: ut_drb.rb =================================================================== RCS file: /ruby/ruby/test/drb/ut_drb.rb,v retrieving revision 1.4 diff -u -w -b -p -r1.4 ut_drb.rb --- ut_drb.rb 13 Mar 2004 05:57:59 -0000 1.4 +++ ut_drb.rb 25 May 2004 05:20:11 -0000 @@ -48,9 +48,9 @@ class DRbEx s end - def do_timeout(n) + def do_timeout(n, id) timeout(1) do - n.sleep(2) + n.sleep(3, id) end end 下のコマンドを実行すると、"0 out" を出力した後フリーズします。 E:\ruby-cvs\ruby>.\ruby -v ruby 1.9.0 (2004-05-25) [i386-bccwin32] E:\ruby-cvs\ruby>.\ruby runruby.rb --ext=".ext" -- bin\testrb -v -n test_06_time out test/drb/test_drb.rb Loaded suite test_drb.rb Started test_06_timeout(TestDRbCore): "0 in" "1 in" "2 in" "0 out" timeout が sleep より短いので TimeoutError が出て do_timeout を抜けるのですが、 サーバ?は依然として生きていて、スリープが終わった後 "0 out" を出力し、関数から帰ろうと した瞬間にフリーズするようです。返る先にはもう制御がないので、そのあたりに原因がありそうな 気がします。(drbの仕組みをよく理解してないので、的外れかもしれません) 試しに drbtest.rb の Onecky#sleep を例外で抜けるようにしてみたところ、(raise "dummy" のコメントを外す) bcc32 でも正常に実行されました。 E:\ruby-cvs\ruby>.\ruby runruby.rb --ext=".ext" -- bin\testrb -v -n test_06_time out test/drb/test_drb.rb Loaded suite test_drb.rb Started test_06_timeout(TestDRbCore): "0 in" "1 in" "2 in" "0 out" "3 in" "1 out" . Finished in 4.617 seconds. 1 tests, 4 assertions, 0 failures, 0 errors