ruby-trunk-changes r32438 - r32461

今日はすこし変更が多かったです。GC でのスタックオーバフロー対策の修正や finalizer で Mutex#lock 取りっぱなしにすると SEGV する問題の対策などがありました。

nari:r32438 2011-07-07 23:59:09 +0900

GC の mark フェーズではオブジェクトの参照関係をたどって mark するために再帰呼び出しをしますが、スタックの残りが少ない時にはスタックオーバフローを回避するためにヒープに取った領域を利用した処理に切り替えます。この判定に使う GC が利用する予定のスタックサイズを configure で実際に似た関数をコンパイルして検出するようにしています。すごいですね。今後 gc.c の gc_mark() と gc_mark_children() に自動変数や引数を追加する時には configure.in のこの関数も修正するのを忘れないようにしないといけませんね。 [Bug #3781]

svn:r32440 2011-07-08 00:23:47 +0900

version.h の日付更新。

drbrain:r32441 2011-07-08 09:18:39 +0900

gc.c の GC に関する rdoc を修正しています。主に英文の添削と例の追加と、GC::Profiler のドキュメント追加。

kosaki:r32442 2011-07-08 10:40:54 +0900

gvl_destroy() で rb_global_vm_lock_t の条件変数(rb_thread_cond_t)の解放の呼び忘れを修正しています。

nobu:r32443 2011-07-08 11:08:29 +0900

r32435 で追加したテスト用の拡張ライブラリで rb_enc_associate() や rb_to_encoding() のプロトタイプ宣言のために #include "ruby/encoding.h" を追加しています。

nobu:r32444 2011-07-08 11:39:15 +0900

r32080 で追加した make love の最初に sudo が利用可能かどうかチェックするためのターゲットで Windows で true コマンドが使えないので echo に変更しています。

kosaki:r32445 2011-07-08 13:09:00 +0900

Fiber のスタックを VALUE の配列として扱っていた(sizeof(VALUE) の整数倍にしていた)のをやめています。

kosaki:r32446 2011-07-08 13:40:01 +0900

ファイナライザの中で Mutex を lock してそのままにすると、ruby インタプリタ終了時のあとしまつでエラーになる問題の対策。 thread_unlock_all_locking_mutexes() を thread.c の外から呼べるように宣言を変え名前も rb_threadptr_unlock_all_locking_mutexes() に改名(rb_ をつけるとインタプリタ内のほかのソースからも呼べる API という目印)し、ruby_cleanup() でファイナライザの処理の後に追加で呼ぶようにしています。 [ruby-dev:44049] [Bug #4988]

kosaki:r32447 2011-07-08 13:50:25 +0900

rb_threadptr_unlock_all_locking_mutexes() にそこから(だけ)呼ばれていた rb_mutex_unlock_all() の処理を展開して1つの関数にしています。 th->keeping_mutexes のクリアをしなくなって大丈夫かな、と一瞬思いましたが rb_mutex_unlock_th() の中で最後の mutex を unlock した時にクリアされるはずなので大丈夫ですね。

kosaki:r32448 2011-07-08 13:57:27 +0900

ファイナライザの中で Mutex#lock を呼んで放置するテストを追加しています。 [ruby-dev:44049] [Bug #4988]

usa:r32449 2011-07-08 14:36:57 +0900

r32438 で configure でスタックフレームサイズを検出するようにしましたが、Windows では有効でないので Makefile.sub で config.h を生成する時にとりあえず 30 という値で GC_MARK_STACKFRAME_WORD を定義するようにしています。実際は 20〜24 word くらいらしいですが、安全側に倒して30としているようです。

nari:r32450 2011-07-08 14:39:50 +0900

r32428 のスタックフレームサイズ検出用の configure でのコードで void * 型のポインタの演算をしていたのを char * にキャストして計算するように修正しています。

usa:r32451 2011-07-08 14:41:52 +0900

r32426 の修正のうち wunlink() でのファイルが消えるまでループして待つ変更のほうを revert しています。これは間違って混入したものだそうです。 そういえば ChangeLog に書かれていないなーと思ったのでした。

usa:r32452 2011-07-08 15:03:17 +0900

ext/openssl/ossl.h で OPENSSL_SYS_WIN32 というマクロをチェックする前に #include するようにしています。このマクロの定義が openssl/e_os2.h の中にあるようです。はっきりとはわかりませんがおそらく Windows でのビルドエラーがあったのではないかと思われます。

nobu:r32453 2011-07-08 15:53:33 +0900

rb_bug() でインタプリタの終了処理中に Thread の情報が解放された後に呼ばれると SEGV してしまうのを修正。 rb_sourcefile() や rb_sourceline() はカレントスレッドの構造体が利用可能な時しか呼んではいけない。

nobu:r32454 2011-07-08 16:01:12 +0900

thread.c にて cmp_tv, substract_tv という struct timeval の操作用のユーティリティ関数は Win32 ではもはや利用していなかったので #ifdef の条件を変更しています。cygwin 版でしか使っていないようです。

nobu:r32455 2011-07-08 16:01:16 +0900

ext/json/parser/prereq.mk で ragel という parser generator で自動生成したソースコードの行末の空白を削除するルールを追加しています。そこまでしますか。

nobu:r32456 2011-07-08 16:39:07 +0900

common.mk で ripper と ext/json/parser が適切に再ビルドされるように依存関係を追加しています。

nobu:r32457 2011-07-08 16:39:09 +0900

ext/json/parser/parser.rl (ragel のためのソース)で文字列のエンコーディング指定のために dup して force_encoding して encode! といしていたのを単に encode を呼ぶだけで済ましています。

nobu:r32458 2011-07-08 16:40:41 +0900

JSON のパーサーが ASCII-8BIT の encoding をもつ文字列を渡すとえその encoding を破壊的に変更してしまっていたので dup を追加しています。

nobu:r32459 2011-07-08 18:00:51 +0900

ext/json/parser/parser.rl で if 文の条件部が () でくくられていなかったのを修正しています。
よくビルドできてたなーと思ったら RTEST() マクロの定義がかっこでくくられていたのでなんとかなっていたわけですね。

nobu:r32460 2011-07-08 18:00:54 +0900

ext/json の下のソースのインデント修正だけです。

naruse:r32461 2011-07-08 21:23:10 +0900

実行体が ELF フォーマットを使っているかどうかの判別を __ELF__ ではなく configure でチェックして定義している USE_ELF に変更しています。 Solaris の SunStudio で __ELF__ が定義されないそうです。 [ruby-dev:44066] [Bug #4998]
というか今は最新版は Sun Studio じゃなくて Oracle Solaris Studio 12 になってるんですね……。