[ruby-trunk - Bug #6382][Assigned] test tracing with set trace func で RuntimeError "continuation cal

Issue #6382 has been reported by nagachika (Tomoyuki C.).


Bug #6382: test_tracing_with_set_trace_func で RuntimeError “continuation
called across threads”

Author: nagachika (Tomoyuki C.)
Status: Assigned
Priority: Low
Assignee: nagachika (Tomoyuki C.)
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

稀にというか実際には一度しか発生していないので効果は確認できていないのですが、
エラーにはなってないので入れてしまいます。