From: "nagachika (Tomoyuki Chikanaga)" Date: 2012-04-30T23:04:50+09:00 Subject: [ruby-dev:45596] [ruby-trunk - Bug #6382][Assigned] test_tracing_with_set_trace_func で RuntimeError "continuation called across threads" Issue #6382 has been reported by nagachika (Tomoyuki Chikanaga). ---------------------------------------- Bug #6382: test_tracing_with_set_trace_func で RuntimeError "continuation called across threads" https://bugs.ruby-lang.org/issues/6382 Author: nagachika (Tomoyuki Chikanaga) Status: Assigned Priority: Low Assignee: nagachika (Tomoyuki Chikanaga) Category: test Target version: ruby -v: ruby 2.0.0dev (2012-04-30 trunk 35497) [x86_64-darwin10.8.0] make test-all を -j2 オプションつきで実行しているとごく稀に test_tracing_with_set_trace_func で "continuation called across threads" という RuntimeError 例外が発生していました。 set_trace_func に設定した lambda から Continuation を呼んでいて、別 Thread がそれを呼んでしまっていたようです。 このテストは r32597 で [Feature #4347] のために追加されたもので、別 Thread からの呼び出しについては元々特に考慮していないようでしたので、呼び出したスレッドをチェックするような変更をすればいいと思います。 diff --git a/test/ruby/test_continuation.rb b/test/ruby/test_continuation.rb index 64390d8..5e5b78c 100644 --- a/test/ruby/test_continuation.rb +++ b/test/ruby/test_continuation.rb @@ -78,10 +78,13 @@ class TestContinuation < Test::Unit::TestCase end def tracing_with_set_trace_func + orig_thread = Thread.current cont = nil func = lambda do |*args| - @memo += 1 - cont.call(nil) + if orig_thread == Thread.current + @memo += 1 + cont.call(nil) + end end cont = callcc { |cc| cc } if cont 稀にというか実際には一度しか発生していないので効果は確認できていないのですが、 エラーにはなってないので入れてしまいます。 -- http://bugs.ruby-lang.org/