Project

General

Profile

Actions

Backport #2603

closed

NetBSD 5.0以降でpthreadの処理に由来する不具合

Added by taca (Takahiro Kambe) almost 15 years ago. Updated over 13 years ago.


Description

=begin
Ruby 1.8.7 patchlevel 249はNetBSD 5.0以降では、pthreadの処理に由来する問題に
より、そのままでは実用に絶えません。

  • Rubyでthreadを使用したプログラム
  • systemやバッククォートで子プロセスを呼び出したプログラム

これらではRuby内部のpthreadによるthread_timer内で待ち続ける状態になって、
プロセスが SIGKILL でないと殺せない状態に陥る場合があります。

再現するには、インストール後に make test-all を行うと途中でテストが止まって、
先に進まなくなります。

[ruby-dev:38996]と本質的な問題は同じと思いますが、症状の出方やNetBSD上での
影響が大きいため別のチケットを作成しました。

pthreadを使用したプログラムには以下の制約があります。

(1) fork(2)した子プロセスは非同期シグナルに対して安全な関数だけを使用でき、
pthread_*()な関数も使用できません(非同期シグナルに対して安全でない)。
(2) fork(2)を呼び出したスレッドだけが子プロセスでは動作し続けます。これは
NetBSDのfork(2)に書かれていますが、要は他のスレッドはいなくなるという
ことです。

[ruby-dev:40051]にて対策が提案されていますが、これを適用しても上記の状況は
解消されないため、先に挙げた問題は発生しなくなるケースもありましたが、完全
には解決しませんでした。

添付のファイルはNetBSD current (5.99.23)で、問題が解消していることを確認し
たものです。

patch-1
子プロセスの方で pthread関係の関数の呼び出しを止めるようにしたもの

patch-2
patch-1に加えてRubyでexec()を実行する場合は、fork(2)前にpthread関係の
処理を従来通りに行うようにしたもの

修正箇所はpatch-2の方が多いですが、patch-1ではexec()を実行する前のpthread
関係の処理(process.cのbefore_exec()によるrb_thread_stop_timre()の呼び出し)も
省いてしまうことになるので、何か副作用があるかもしれません。
=end


Files

patch-1 (1.18 KB) patch-1 taca (Takahiro Kambe), 01/14/2010 12:32 PM
patch-2 (3.24 KB) patch-2 taca (Takahiro Kambe), 01/14/2010 12:32 PM

Related issues 5 (0 open5 closed)

Related to Ruby master - Bug #270: lazy timer thraed creationClosedko1 (Koichi Sasada)Actions
Related to Ruby master - Bug #2724: fork from other than the main thread causes wrong pthread condition on NetBSDThird Party's Issue02/09/2010Actions
Related to Backport187 - Backport #2739: ruby 1.8.7 built with pthreads hangs under some circumstancesClosedshyouhei (Shyouhei Urabe)02/12/2010Actions
Related to Ruby master - Bug #6341: SIGSEGV: Thread.new { fork { GC.start } }.joinThird Party's Issue04/22/2012Actions
Has duplicate Backport187 - Backport #2663: Hard hang (needs -9 to kill) in 1.8.7 build 248Closed01/27/2010Actions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0