From: KOSAKI Motohiro Date: 2015-06-17T11:46:52-04:00 Subject: [ruby-dev:49104] Re: [Ruby trunk - Bug #11265] deadlock on Solaris 10 since r50900 2015-06-17 11:40 GMT-04:00 : > Issue #11265 has been updated by Naohisa Goto. > > > test/lib/test/unit.rb の _run_parallel メソッド内の 408-410行目にて、以下のタイミングで発生していることはわかりました。 > > 1. 408行目では start_watchdog を呼ぶ。 > 2. start_watchdog メソッド内では、新スレッドを作成してすぐにリターンする。 > 3. start_watchdog で作成したスレッド内では、Process.wait2 を呼んでいる。しかし、まだ子プロセスを作成する前なので、Errno::ECHILD 例外が発生し、せっかく作った新スレッドはあえなく終了する。(つまり、名前に反して watchdog を行うことは無い。これはバグだと思う。) > 4. 409行めは空行。410行目にて @options[:parallel].times {launch_worker} が実行される。 launch_worker は内部ですぐに Worker.launch を呼び、その中で IO.popen にて別プロセスのRubyを起動する。 > > この上記3の Process.wait2 に失敗してスレッドが終了するのと、上記4のIO.popenの実行がだいたい同時に発生したら、デッドロックが発生するようです。 > > ただし、上記3のうち、Process.wait2 と、スレッド終了のどちらが要因なのかは、同定できませんでした。 デッドロックしたときのCスタックトレースはとれますか? 特に IO.popen のほうがどこで刺さっているのか気になります。