ruby-trunk-changes r37903 - r37947

今日は Fiddle や Psych や Thread や Mutex まわりでたくさん変更がありました。
Fiddle は DL に依存せず DL から実装をマージして、DL は deprecated になりました。2.0 からは DL ではなく Fiddle を使うことになるようです。
拡張ライブラリ psych に libyaml のソースコードが同梱され、システムにインストールされていなくてもこれを利用してビルドできるようになりました。
Thread#join は先日トラップハンドラ内で禁止されましたが、これは取り消されてまた可能になりました。
また Mutex#sleep は割り込みを受けた時に指定した時間になっていなくても処理を抜けてくる spurious wakeup という挙動をするように変更されました。
また GVL を解放する rb_thread_call_without_gvl2() という API のインタフェース/挙動が変更されました。
strscan に StringScanner#charpos という文字単位で位置を取得するメソッドが追加されました。

svn:r37903 2012-11-28 01:20:26 +0900

version.h の日付更新。

naruse:r37904 2012-11-28 03:02:31 +0900

ruby_atomic.h で定義している ATOMIC_CAS() で利用している __sync_val_compare_and_swap_4 は x86/Linux では gcc に -march=i486 を指定しないと(少なくとも gcc 4.1 では)動かないそうなのでオプションを追加しています。

naruse:r37905 2012-11-28 03:04:55 +0900

configure の --with-opt-dir オプションの処理で sed の -E オプションを利用していたのは動かない環境もあるということで -E なしで標準の正規表現のみ使うように修正しているようです。

naruse:r37906 2012-11-28 03:12:53 +0900

r37904 で gcc のオプションに -march=i486 を指定していましたが i686-linux といったアーキテクチャでも i486 になってしまっていたので、CPU 種別の名前に合わせた指定(たいてい i686)をするようにしています。

tenderlove:r37907 2012-11-28 04:54:50 +0900

r37881 で一旦入れて r37891 で revert した拡張ライブラリ fiddle を拡張ライブラリ dl に依存しないようにする修正が再度入れられています。ぱっとみ大きな変更はなく、変数名や関数名の変更などのリファクリングを追加したようです。

nobu:r37908 2012-11-28 04:57:10 +0900

新規追加されたファイルの svn property を設定。

zzak:r37909 2012-11-28 08:26:07 +0900

拡張ライブラリ fiddle の rdoc の追記、表記や体裁の修正など。

zzak:r37910 2012-11-28 08:27:36 +0900

拡張ライブラリ dl のロード時に deprecated であることを警告メッセージとして表示するようにしています。今後は Fiddle が代替となります。

naruse:r37911 2012-11-28 08:30:33 +0900

r37904 および r37906 の configure の -march オプション指定の再修正。 元の変更は revert して、実際に __sync_val_compare_and_swap が使えるかをチェックして使えなかったら -march=i486 を指定するようにしています。 このときは i486 固定でいいんでしょうか。

zzak:r37912 2012-11-28 08:55:31 +0900

.document ファイルに README, README.ja, README.EXT, README.EXT.ja を追加しています。

zzak:r37913 2012-11-28 08:57:20 +0900

doc/globals.rdoc というファイルを追加して、特殊変数や定数の説明をそこに記述しています。 [ruby-core:29048] [Bug #3022]

tenderlove:r37914 2012-11-28 09:02:49 +0900

拡張ライブラリ fiddle の dl 互換性のための追加修正など。C 言語の型のアライメントの定数を Fiddle に追加したり dl の Ruby スクリプトのライブラリを fiddle に移動してモジュール等の名称を変更したり。

nobu:r37915 2012-11-28 09:03:05 +0900

新規追加(というか移動?)したファイルの svn property を変更しています。

ryan:r37916 2012-11-28 09:17:33 +0900

拡張ライブラリ strscan に StringScanner#charpos というメソッドを追加して、現在の位置を byte 単位ではなくて(StringScanner#pos という既存のメソッドは byte 単位)文字数単位で取得できるようにしています。

zzak:r37917 2012-11-28 11:08:39 +0900

拡張ライブラリ fiddle の rdoc の追記や体裁、文法の修正です。

kosaki:r37918 2012-11-28 13:09:38 +0900

r37852 で Signal.trap のトラップハンドラ内では Thread#join ができないようにチェックを入れてたのですが、 thread_join_m() でチェックをしていた為 Thread#join のみでチェックしていて Thread#value (これもスレッドの終了を待つ)でチェックされていなかったので thread_join() に移動してどちらも禁止するようにしています。 また NEWS ファイルも合わせて変更しています。

tenderlove:r37919 2012-11-28 13:34:41 +0900

拡張ライブラリ psych は libyaml に依存していて、システムに libyaml がインストールされていない時にビルドできないのですが、syck が削除された今 psych がビルドできないと YAML がパースできなくて rubygems も動かなくて……と主要な機能が使えなくなってしまうので、pysch 内に libyaml のソースを同梱して必要ならそれを利用するようにしています。 またこれに合わせて psych のバージョンを 1.3.4 から 2.0.0 に更新しています。 RDoc といい Rake といい Rubygems も(まだですが)、空前のメジャーバージョンアップラッシュですね。 [ruby-core:49463] [Feature #7375]

nobu:r37920 2012-11-28 13:35:40 +0900

新規追加されたファイルの svn property 設定。

kosaki:r37921 2012-11-28 13:43:15 +0900

プロセス終了時にそれ以降の新規 Thread の生成を禁止するための rb_vm_struct::inhibit_thread_creation というフィールドを使っていたのですが、このフィールドを構造体から削除して、メインスレッドの status が THREAD_KILLED だったら終了中として Thread の生成を禁止するようにチェックする方法を変更しています。

kosaki:r37922 2012-11-28 14:40:54 +0900

r37867 で Signal.trap のトラップハンドラ内で Mutex の操作も禁止していましたが、Mutex#try_lock はデッドロックを引き起こさないので許すようにチェックする位置を変更しています。

ko1:r37923 2012-11-28 14:52:11 +0900

r37919 で psych に libyaml を同梱して、ソースを必要に応じてコピーしているのですが、ソースディレクトリではなくてビルドディレクトリにコピーするようにしています。また $obj にコピーしたソースファイルを含むソースファイルからオブジェクトファイル名リストを作って格納しておくようにしていますが、この部分は後で再度修正されているようです。

ngoto:r37924 2012-11-28 15:29:05 +0900

r37904, r37906, r37911 で ATOMIC_CAS のための __sync_val_compare_and_swap のチェックとコンパイラオプションの追加をしたのを revert しています。 Solaris Studio や Fujitsu C Compiler などのコンパイラでビルドできなくなっていたとのこと。 [ruby-dev:46646] [Bug #7451]

kosaki:r37925 2012-11-28 15:36:28 +0900

io.c の未使用のマクロ定義を除去しています。

naruse:r37926 2012-11-28 15:45:25 +0900

r37904, r37906, r37911 の再修正で __sync_val_compare_and_swap のチェックして -march=i486 を追加するのはプラットフォームもチェックして x86Linux の時だけに変更しています。 [ruby-dev:46646] [Bug #7451]

drbrain:r37927 2012-11-28 16:41:19 +0900

rdoc をサーバとして動かした時に別の(サブ?)ディレクトリを mount できるようにしているようです。

ko1:r37928 2012-11-28 17:00:53 +0900

Proc#== と Proc#eql? の定義が削除されています。つまり Object の実装が利用されるので、object_id での比較になり、手続きの内容が同じでも同値にならなくなりました。これまでも true になったり false になったり不完全だったので、すっぱり同値の判定はあきらめたということですね。 [ruby-core:35632] [Bug #4559]

ko1:r37929 2012-11-28 17:01:43 +0900

r37928 の ChangeLog エントリにチケットの参照を追記しています。 [ruby-core:35632] [Bug #4559]

kosaki:r37930 2012-11-28 17:30:51 +0900

rb_mutex_t::allow_trap という構造体フィールドを追加して、Mutex の操作をトラップハンドラ内で禁止するためのチェックを IO.binwrite でインタプリタが内部的に使う時には無視して実行できるようにしています。

kosaki:r37931 2012-11-28 17:31:03 +0900

rb_thread_t::status の値の THREAD_TO_KILL を削除して、rb_thread_t::to_kill というフィールドを独立して用意して、これで表現するようにリファクタリングしています。また 非同期例外を投げると Thread のステータスが上書きされてしまうことがある不具合を修正しています。 [ruby-core:50249] [Bug #7450]

nobu:r37932 2012-11-28 21:17:30 +0900

lib/test/unit.rb で Test::Unit::{Glob,LoadPath}Option での不要なモジュールの include をやめています。

nobu:r37933 2012-11-28 21:19:49 +0900

標準添付ライブラリ mkmf に COMPILE_RULES に "$(*VPATH*)" という文字列を含むルールを書いておくと、その部分を $VPATH ([$(srcdir)、 $(topdir)、 $(arch_hdrdir)/ruby、 $(hdrdir)/ruby])毎に展開してくれるような機能を追加しています。
そして win32/Makefile.sub がその機能を使っているようです。っていうか win32/Makefile.sub って mkmf.rb を経由するんですね、知らなかった!
おまえは何を言っているんだ……。 Makefile.sub が config.status を生成する部分でした。

nobu:r37934 2012-11-28 21:21:19 +0900

r37923 で psych の extconf.rb で同梱されている libyaml のソースをコピーしているのをやめて、VPATH に yaml ディレクトリを追加することでサブディレクトリを探索パス(っていうんでしょうか)に追加することでそのままコンパイルできるようにしています。

nobu:r37935 2012-11-28 21:22:47 +0900

拡張ライブラリ psych の extconf.rb で $mswin でコンパイルオプションでのマクロ定義を追加していた部分が mingw32 でも必要なものだったので have_macro(_WIN32) で判定するように修正しています。

nobu:r37936 2012-11-28 21:23:20 +0900

拡張ライブラリ psych のいくつかの関数の引数の char * に const 修飾子を付与しています。警告除去でしょうか。

tarui:r37937 2012-11-28 21:34:15 +0900

Signal.trap のトラップハンドラ内で Thread#join で待つのを禁止していましたが、その制限をやめて結局 Thread#join を呼べるようにしています。sleep_forever(), sleep_timeval(), sleep_wait_for_interrupt() などに引数 spurious_check を追加して、sleep から割り込み等で起きた時に対象の Thread のステータスをチェックして終了するまでループするようにしているのをやめる(spurious_check == 0)こともできるようにして、Thread#join から呼ばれる時は spurious wakeup でも抜けるようにしています。 Thread#join の実装の thread_join_sleep() では sleep_{forever,wait_for_interrupt} を呼んでいる外側で対象の Thread のステータスをチェックしてループしているので不要です。 sleep_forever() のところで止まってしまうとトラップハンドラ実行中に対象のスレッドが終了した時に終了を検出できずに眠ったままになってしまう可能性がありました。
またついでに Thread#join でその Thread を待っている Thread を管理するリストの実装をリファクタリングしています。

ko1:r37938 2012-11-28 22:01:25 +0900

rb_thread_call_without_gvl2() という GVL を解放して関数を呼ぶ API のインタフェースと挙動を変更しています。 rb_thread_call_without_gvl2() は実行後の割り込みチェックをせずに処理を続行できるように呼び出される関数から指定できるという点が rb_thread_call_without_gvl() と異なる API だったのですが、第2引数が削除されたのでその機能はなくなり、GVL を解放する前に割り込みをチェックして割り込まれていたら関数の呼び出しはキャンセルしてすぐに return するという挙動をする API に変更されています。

tarui:r37939 2012-11-28 22:24:36 +0900

r37937 でトラップハンドラ内の Thread#join が例外にならなくなったのでテストも修正しています。

ko1:r37940 2012-11-28 22:56:29 +0900

vm_insnhelper.c の vm_call_method() で内側のスコープ(ブロック)での自動変数へのポインタをその外に持ち出して使っているところがったので変数の宣言位置を変更しています。

ko1:r37941 2012-11-28 22:57:52 +0900

r37938 で BLOCKING_REGION() に割り込みがあった時の挙動のフラグが引数に追加されたのに thread_win32.c でも追随しています。

tarui:r37942 2012-11-28 23:37:47 +0900

NEWS ファイルからトラップハンドラ内での Thread#join、value の禁止の項目を削除しています。

ko1:r37943 2012-11-28 23:40:00 +0900

Mutex#sleep は spurious wakeup するように変更されています。これは割り込みがあった時などに指定した秒数が経過していなくても処理が返ってきてしまう可能性があるから必要に応じて自分でループしろということだと思うのですが、うーんそうなんですね。そこはインタプリタでよろしくやってくれるのが Ruby 流だと思ってたのですが。まあ Mutex#sleep はあまりアプリケーションで直接使うことはない低レイヤのメソッドのような気もするのでそれもでいいのかも。 なお Queue と トラップハンドラを組み合わせた時の不具合の対処のために入った変更とのこと。 そういえば Queue を C で再実装するっていうチケットもあったような。 [ruby-dev:46654] [Bug #7455]

ko1:r37944 2012-11-28 23:41:13 +0900

r37943 の ChangeLog にチケット番号の参照と ML のリンクを追記しています。

tarui:r37945 2012-11-28 23:53:47 +0900

r37942 で NEWS ファイルの Thread#join, value の記述で対象がメインスレッドの時の例外発生についての記述まで一緒に消してしまっていたので、そちらは戻しています。

nagachika:r37946 2012-11-28 23:55:41 +0900

r37917 の rdoc 用コメントの空白が抜けていたところを修正。

nagachika:r37947 2012-11-29 02:56:39 +0900

r37938 の ChangeLog エントリの typo 修正。