[ruby-dev:49104] Re: [Ruby trunk - Bug #11265] deadlock on Solaris 10 since r50900

From: KOSAKI Motohiro <kosaki.motohiro@...>
Date: 2015-06-17 15:46:52 UTC
List: ruby-dev #49104
2015-06-17 11:40 GMT-04:00  <ngotogenome@gmail.com>:
> 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 のほうがどこで刺さっているのか気になります。

In This Thread

Prev Next