ruby-trunk-changes r32028 - r32070

今日はチケット整理の影響か、大量に変更がありました。たくさん変更はありますが dRuby の終了時のポリシー変更と GVL の実装の全面的な変更、あと CMath.cbrt の仕様の変更などが大きなところです。

seki:r32028 2011-06-12 23:40:15 +0900

dRuby の DRb.stop_service でサービスを終了する時に、そのサービスで処理を受け付けて実行中の子 Thread を全て強制終了している kill_sub_thread メソッドを削除して、 DRb.stop_service では実行中のスレッドは止めないようにしています。 [ruby-core:34185] [Bug #4243]
dRuby の挙動が少し変化することになるので利用している人は注意してみる必要があると思います(必要があれば処理中のスレッドは明示的に待たせるなど)。わたしも使ってますが、多分あまり悪い影響はなくて [Bug #3674] がこの変更で結果的に解決すると思います。

emboss:r32029 2011-06-13 00:48:28 +0900

OpenSSL::PKey::DSA の rdoc を追記しています。

svn:r32030 2011-06-13 00:48:31 +0900

version.h の日付更新。

emboss:r32031 2011-06-13 02:03:26 +0900

OpenSSL::PKey::DH の rdoc 追記、OpenSSL::PKey::DSA のサンプルコードの修正をしています。

emboss:r32032 2011-06-13 02:43:38 +0900

OpenSSL::PKey::DSA#syssign/sysverify についてのテストを追加しています。

naruse:r32033 2011-06-13 03:13:06 +0900

benchmark のテストで出力を取り込んでいるところで経過時間に負の値を許容するようにしています。コミットログによると NetBSD ではすぐに終了する処理の前後で Process.times を取って差分を計算すると負になることがあるそうです。
コメントでの指摘によるとこれは NetBSD 固有の問題ではなくて、マルチプロセッサの時に CPU 内蔵の tsc が異なるので途中で実行CPU が移動すると時刻が歪むことがあるそうです。

naruse:r32034 2011-06-13 03:20:25 +0900

testunit の並列テスト自体のテストで Process.kill で子プロセスを停止させる場合に既に子プロセスが終了していたら Errno::ESRCH が発生するので rescue するようにしています。

ko1:r32035 2011-06-13 04:44:48 +0900

拡張ライブラリ objspace で利用できるようになる ObjectSpace.memsize_of や memsize_of_all でインタプリタ内部でのみ利用されるオブジェクト(NODE や ICLASS、回収済みの ZOMBIE)はスキップするようにしています。これらはもともとサイズ 0 と計算されるので余計な関数呼び出しを抑制しているだけです。また特異クラスもスキップするようになっています。しかし特異クラスはメソッドエントリを持つことができるのでスキップしなくて良いような気がするのですがどうなのでしょうか。

emboss:r32036 2011-06-13 05:39:38 +0900

openssl についていくつかの修正がまとめて入っています。
まず OpenSSL::PKey.read というメソッドを新設し、文字列から任意の鍵をロードできるようになっています。 [ruby-core:35330] [Feature #4424]
また OpenSSL::PKey::EC のテストを追加しています。
OpenSSL::PKey::DH の rdoc の修正もあります。
あと細かい点ですがテストで PKey を使う時に test/openssl/utils.rb にあらかじめテスト用の鍵を定数に用意していたので、それを使うようにリファクタリングしていたりします。

emboss:r32037 2011-06-13 05:52:25 +0900

NEWS ファイルに OpenSSL::PKey.read の追加を記述しています。

emboss:r32038 2011-06-13 10:15:20 +0900

OpenSSL::PKey::DH の rdoc で public_key と pub_key の差が明確になるように記述を追加しています。

emboss:r32039 2011-06-13 10:58:09 +0900

OpenSSL::PKey::DH の rdoc を再修正。また OpenSSL::PKey::DH のテストを追加しています。

emboss:r32040 2011-06-13 11:37:35 +0900

OpenSSL::Digest.new でハッシュ関数の名前を文字列だけでなくて OpenSSL::ASN1::ObjectId の oid, sn, ln など(何のことはかよくわかっていませんが)からも生成できるように機能を追加しています。 [ruby-core:35319] [Feature #4412]

naruse:r32041 2011-06-13 12:54:53 +0900

ext/psych/lib/psych/deprecated.rb で Object に to_yaml_properties というメソッドを追加しているところでその前に一旦同じメソッドを undef しています。ruby を -w オプションをつけて実行するとメソッドの再定義で警告メッセージが出力されるのでそれを抑制しています。

naruse:r32042 2011-06-13 12:54:55 +0900

Syck のテストの前に YAML::ENGINE.yamler を "syck" に上書きしています。 YAML::ENGINE.yamler のデフォルトが Psych に変更になったのでテストで Syck のつもりで Psych を使ってしまっていたようですね。

naruse:r32043 2011-06-13 12:54:57 +0900

ext/syck/lib/syck/rubytypes.rb でも Object#to_yaml_properties を定義前に undef しています。

naruse:r32044 2011-06-13 12:55:00 +0900

lib/yaml.rb でデフォルトの engine を Psych に変更したはずですが、先に require "sych" していると結局 Syck を利用していて、その時も require "psych" を実行して、libyaml が利用できなくて pysch がビルドできていない環境では毎回警告メッセージが出ていたので require "yaml" 前に require "syck" されていたら require "psych" はしないようにしています。

emboss:r32045 2011-06-13 13:09:04 +0900

r32040 で OpenSSL::Digest.new に受け付ける引数を拡張した時に普通に名前の文字列("MD5" みたいな)を渡した時に、 oid を持たない文字列(DSS1 など)がエラーになっていたのを修正しています。

mrkn:r32046 2011-06-13 14:22:40 +0900

lib/test/unit.rb で || と | を間違えていたのを修正。

mrkn:r32047 2011-06-13 14:36:59 +0900

CMath.cbrt (三乗根を返す)に -8 を渡すと -2 を返していたのを、複素数を返すようにしています。 [ruby-dev:41972] [Bug #3676]
-8 の三乗根が -2 なら正しいじゃないかと思ってしまいますが、複素数を範囲とする関数なので解は 3通り存在するので、数学的には複素平面上で仰角(X軸と成す角)がもっとも小さいものを主値と言いこれを返すのが自然ということです。

naruse:r32048 2011-06-13 16:41:20 +0900

r32043 で Object#to_yaml_properties を undef する時に例外が発生し得るので rescue で保護を追加しています。

naruse:r32049 2011-06-13 17:03:22 +0900

Net::HTTP#use_ssl? で常に require "openssl" していたのを https を利用する時(でまだ require していない時)だけにしています。 r31933 の変更を再修正。

akr:r32050 2011-06-13 18:36:48 +0900

SecureRandom.random_bytes が fork した子プロセスで同じ乱数列を使い続けてしまうので fork 後に利用する時には seed を設定しなおすようにしています。 [ruby-core:35765] [Bug #4579]

mrkn:r32052 2011-06-13 18:51:48 +0900

BigDecimal#= や <, > など比較演算子のメソッドで右辺に Integer や Float, Rational も受け付けるようにしています。

mrkn:r32053 2011-06-13 18:51:52 +0900

rb_typeddata_is_kind_of() を利用してオブジェクトが BigDecimal かどうか判定する is_kind_of_BigDecimal() という関数を新設して利用するようにリファクタリングしています。

naruse:r32054 2011-06-13 19:21:07 +0900

r31933 の Net::HTTP#use_ssl? に関連して再度修正。Net::HTTP#use_ssl= で SSL の利用を指定された時点で require "openssl" するようにしています。

keiju:r32055 2011-06-13 19:48:12 +0900

lib/cmath.rb で Object#real? というメソッドを追加して TypeError を発生させるようにしています。 [ruby-dev:40961] [Bug #3137]
これは require "complex" すると Math.atan(nil) の投げる例外が変化するという不具合? のための対処のようです。

ko1:r32056 2011-06-13 20:25:44 +0900

メソッドキャッシュの更新のために ruby_vm_global_state_version をインクリメントしてオーバフローした時に呼ぶ vm_clear_all_cache() という関数を新設しています。また vm_clear_all_inline_method_cache() という関数でインラインキャッシュもクリアしようとしていますがこれの内容は未実装です。コメントによると GC 中は rb_objspace_each_objects() が使えないので全ての iseq を巡回するのをどうしようかというのが課題のようです。

emboss:r32057 2011-06-13 20:32:43 +0900

OpenSSL::Digest.new のテストで "MDC2" を削除しています。libopenssl によって扱えない場合があるようです。

emboss:r32058 2011-06-13 20:56:04 +0900

test/openssl/test_ec.rb の内容を test/openssl/test_pkey_ec.rb へ移動しています。また OpenSSL::PKey::EC のテスト用の鍵を作成するのは EC が利用可能な時だけにするようにしています。openssl のバージョンによってテストがエラーになっていました。

kosaki:r32059 2011-06-13 21:49:53 +0900

Windows 版の native_cond_signal() でその条件変数で wait 中のスレッドが居ない時に呼ぶと rb_bug() でエラー終了していましたが、これはエラーではないので削除しています。 [ruby-dev:43554] [Bug #4696]

nobu:r32060 2011-06-13 23:05:56 +0900

最近新規に追加されたファイルの svn property の設定のみです。

nobu:r32061 2011-06-13 23:06:35 +0900

ext/io/console/console.c のマクロの typo を修正しています(DEVISE -> DEVICE)。挙動は変化していません。

akr:r32062 2011-06-13 23:11:23 +0900

UNIXSocket#send_io と recv_io で file descriptor passing (UNIX ドメインソケットを使うと別のプロセスにファイルディスクリプタを渡すことができます)で sendmsg(2)/recvmsg(2) を呼ぶ前に select(2) をしていたのをやめ、sendmsg(2)/recvmsg(2) がエラーを返した時にリトライするようにしてその時に select(2) するようにしています。 複数のスレッドが同じソケットに操作する場合は select(2) で確認しても実際に sendmsg(2)/recvmsg(2) する前に他のスレッドが読み書きしてしまうかもしれないので select(2) しても意味がないためだそうです。retry する時に select(2) するのは意味があるのでしょうか。 [ruby-core:35574] [Bug #4535]

akr:r32063 2011-06-13 23:12:23 +0900

r32062 のテストで Thread.abort_on_exception = true を使ってスレッドでの例外発生をエラー終了にしていたのをやめて Thread#value で終了時の値を取り出してチェックするように変更しています。

kosaki:r32064 2011-06-13 23:14:53 +0900

GVL(インタプリタで1つのスレッドだけが動作するために取得するロック)の実装を「完全に書き直した」そうです。以前 fairness のためにリストでスレッドを管理して順番に起こすようにしたしくみは廃止されて、シンプルに cond_wait と cond_signal で rb_vm_t::gvl::acquired が を 0 になるまで待つモデルにして、fairness は gvl_yield() という関数を導入して他のスレッドが GVL を確保したのをこれも cond_wait/cond_signal で確実に知ってから再取得できるようにしています。また rb_thread_t::running_time_us というメンバを追加して、スレッドが連続して動作した時間をタイムスライス毎に加算していって、一定の値(priority によって増減するようにしていますが、だいたい 250msec)に達したら gvl_yield() を呼ぶようにしています。

nobu:r32065 2011-06-13 23:28:53 +0900

拡張ライブラリ io/console で追加される IO.console が端末と切り離されたプロセス(Process.daemon とかしたもの)の時に nil を返すようにしています。

nobu:r32066 2011-06-13 23:33:36 +0900

IO.console で作る IO は sync = true になるように(バッファリングされないのがデフォルトになるように)しています。

nobu:r32067 2011-06-13 23:38:26 +0900

Ripper が :"a \n b \n c" のような式のパースをうまくできていない不具合の修正です。 [ruby-dev:43762] [Bug #4544]

usa:r32068 2011-06-13 23:51:25 +0900

r32066 の Windows 版の部分の typo 修正。

kosaki:r32069 2011-06-14 00:06:30 +0900

rb_thread_schedule_rec() で GVL_YIELD の有無で条件コンパイルで分岐していたのをやめて、Windows 版の gvl_yield() (実装はただの native_thread_yield()) も用意して常に gvl_yield() が定義されているようにしています。

svn:r32070 2011-06-14 00:06:34 +0900

version.h の日付更新。