ruby-trunk-changes r47439 - r47443

今日は vfork(2) の利用に関して、利用できない環境の考慮を追加しています。

nobu: r47439 2014-09-07 10:10:43 +0900

pthread と frok(2) が同時に使えるかどうか configure でチェックしていたのを vfork(2) と pthread についても独立して調べるようにして、使えない場合は vfork(2) は利用しないようにしています。

svn: r47440 2014-09-07 10:10:53 +0900

version.h の日付更新。

nobu: r47441 2014-09-07 10:57:44 +0900

r47439 の vfork(2) と pthread の併用のチェックは revert して、単に Mac OS X では vfork(2) は利用しないようにしています。 OS X では vfork() を使うと test_process.rb の test_deadlock_by_signal_at_forking が並列実行時にデッドロックしてしまうそうです。 むむ、残念ですね。

nobu: r47442 2014-09-07 11:04:16 +0900

r47441 の Mac OS X で vfork(2) の利用を無効化するのを ac_cv_func_vfork_works=no を設定していたのを ac_cv_func_vfork=no に変更しています。 ac_cv_func_vfork_work は上書きされてしまうので効かなかったそうです。

akr: r47443 2014-09-07 12:47:47 +0900

r47437 で pthread_setcancelstate(3) を使って fork 前後で pthread の cancelstate をリセット/復元していた部分で PTHREAD_CANCEL_DISABLE が未定義の時はコンパイルしないようにしています。 Android でこの定数が存在しないそうです。
ちなみに akr さんがブログで詳しく書かれていますが (参考URL: http://www.a-k-r.org/d/2014-09.html#a2014_09_06 )、pthread_setcancelstate() で cancel 無効化しているのは、子プロセスで pthread_cleanup_push(3) で登録した関数が cancel 時に呼び出される可能性があるのを潰すために念のためやっておく、というものだそうです。 vfork(2) 利用時は子プロセスで意図しない処理が(atexit(3)、シグナルハンドラ、pthread_atfork(3) など)実効されないように注意しないといけないようです。なかなか大変ですね。