ruby-trunk-changes r32389 - r32403

現在の trunk の ruby で Passenger が動かないのに対処するための Rubyインタプリタが内部的に利用している file descriptor を判定するための API の追加、coverage のリスタート対応の revert、マシンスタックのアドレス計算の修正などがありました。

yugui:r32389 2011-07-03 23:44:59 +0900

ext/extmk.rb で拡張ライブラリの extconf.rb からの出力を verbose モードでなければ端末(標準出力)には出さないようにしています。またコンパイル失敗時に警告メッセージを出力するようにしています。

kosaki:r32392 2011-07-04 06:09:50 +0900

NEWS ファイルに File::DIRECT 定数の追加について追記しています。

svn:r32393 2011-07-04 06:09:54 +0900

version.h の日付更新。

ko1:r32394 2011-07-04 06:56:59 +0900

rb_reserved_fd_p() という関数とそれを呼ぶ RB_RESERVED_FD_P(fd) というマクロの定義を公開 API に追加しています。これはタイマースレッドへの通知用に利用する pipe のようにインタプリタが内部で利用している fd を検出するための API です。また IO.new で内部の fd を使って IO オブジェクトを作るのを禁止しています。
これは [ruby-core:37727] で Passenger が fork した時に全ての file descriptor を問答無用で閉じているためにタイマースレッド用の pipe も閉じられてしまってエラーになるという問題が報告されていて、その対策のために追加したものです。アプリケーション(Passenger)側でこの API を使って閉じるべきでない fd を認識するようにする必要があります。

naruse:r32395 2011-07-04 07:16:02 +0900

thread_pthread.c の get_stack() にてマシンスタックのアドレスとサイズの取得で FreeBSD など BSD 系の環境向けの部分(pthread_attr_getstackaddr() 等を利用)でも返ってくるのはスタックの base address なので size を足して start address にするようにしています。その他 #ifdef にコメントを付加しています。
こうなると、その後の MacOS X 用とコメントされた pthread_get_stackaddr_np() を利用している場合も同じようにしないといけないのではないかという気がしてきますが、実験してみると Mac OS X で pthread_get_stackaddr_np() はスタックの一番上のアドレス(開始位置)を返しているようです。ふーん。

nobu:r32396 2011-07-04 15:49:15 +0900

rexml で encoding を返すメソッドが文字列表現じゃなくて Encoding オブジェクトを返すという変更が NEWS ファイルに書かれていましたが、その修正は r31008 で revert されているので NEWS の記述も戻しています。

nobu:r32397 2011-07-04 15:49:53 +0900

NEWS ファイルの行末の空白を削除。

nobu:r32398 2011-07-04 15:52:35 +0900

thread_start_func_1() で thread_start_func_2() にマシンスタックの開始位置として渡すためのダミーの変数として使っていた stack_start は USE_NATIVE_THREAD_INIT が真の時は get_stack() で取得したスタックの開始位置を使うようになったために不要になったので #if !USE_NATIVE_THREAD_INIT で宣言を囲んでいます。

nobu:r32399 2011-07-04 15:52:39 +0900

insns.def には ShifT_JIS で日本語のコメントが記述されているので、emacs 用にエンコーディング指定のコメントが追加されています。

mrkn:r32400 2011-07-04 19:22:44 +0900

NEWS の rexml の変更点の項目からさらに [incompatible] という記述を削除しています。encoding のメソッドの仕様変更が非互換だったのですが、それが戻されているからですね。

mame:r32401 2011-07-04 21:21:02 +0900

r32071 で coverage をリスタート可能にしたら Mac OS X で SEGV するようになってしまったので revert しています。 [ruby-core:37352] [Bug #4927]

kosaki:r32402 2011-07-04 21:58:07 +0900

r32395 で追加したコメントを少し修正しています。スタックの開始位置はだいたいアドレスの大きいほうですが、アーキテクチャによっては上に伸びる(開始位置がアドレスの小さいほう)場合もあるのでちょっと表現を変えています。addr に size を加算するかどうかも Linux の場合と同じように STACK_DIR_UPPER() マクロを使って変えたほうがよさそうですね。

kosaki:r32403 2011-07-04 22:27:31 +0900

スタックアドレスの取得について追加の修正です。 BSD 系の OS でも pthread_attr_getstack() が使える場合はそちらを利用するようにしています。また addr に size を足すかどうか(スタックが上に伸びるか下に伸びるか)をどちらにも対応できるように STACK_DIR_UPPER() マクロを利用するようにしています。