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

From: ngotogenome@...
Date: 2015-06-25 08:12:28 UTC
List: ruby-dev #49140
Issue #11265 has been updated by Naohisa Goto.

File test-solaris-fork-deadlock.c added

> fork だと、fork 時に運悪くロックが確保されていて子プロセスにそのロックがそのままコピーされると、
> 子プロセスにはロックを持っているスレッドが存在しないため、
> やはりロックは解除されないんじゃないかという気がするのですが。

それは確かに心配なので、簡易な実験をしてみました。
添付の、別スレッドで dlsym をループして呼び続けながら、メインスレッドで fork または vfork を呼ぶプログラムを何回も実行したところ、
vfork の場合は、3%程度の割合でデッドロックに陥り親子とも停止しましたが、
fork の場合は、1000回以上実行しても1回もデッドロックせず100%正常終了しました。

Solaris の fork(2) は manページに  MT-Level: Async-Signal-Safe と記述されているだけあって、システム内のロックに対する何らかの配慮があるようです。
(一方 vfork は MT-Level: Unsafe と記述されている。)

結論: Solarisでは必ずforkを呼ぶようにします。

(なお、上記は、システムがシステム内部に暗黙に持っているロックの話で、
ユーザーランド内のロックはforkが勝手に解除することは無いため、
「子プロセスにはロックを持っているスレッドが存在しないため、やはりロックは解除されない」
に常に注意が必要なのは変わりません。)


----------------------------------------
Bug #11265: deadlock on Solaris 10 since r50900
https://bugs.ruby-lang.org/issues/11265#change-53117

* Author: Naohisa Goto
* Status: Assigned
* Priority: Normal
* Assignee: Naohisa Goto
* ruby -v: -
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN
----------------------------------------
Solaris10にて、r50900 以降、
 TestParallel::TestParallel#test_jobs_status
 TestParallel::TestParallel#test_separate
のいずれか、または両方で、テストが停止状態となり次に進まなくなります。
スレッドのデッドロックが発生しているような感じです。

ところで、こういう場合の上手いデバッグ方法って何があるでしょうか?


---Files--------------------------------
test-solaris-fork-deadlock.c (2.9 KB)


-- 
https://bugs.ruby-lang.org/

In This Thread

Prev Next