ruby-trunk-changes r39890 - r39908

今日は Rinda::TupleSpaceProxy の不具合修正、Rinda::RingServer の multicast 対応の追加、GC の LazySweep をコンパイル時に off にするマクロの導入と String#rpartition のマルチバイト文字での不具合の修正などがありました。

drbrain:r39890 2013-03-24 03:34:16 +0900

Rinda::TupleSpaceProxy で tuple が喪失することがある不具合の修正らしいのですが、このコミットには ChangeLog の変更しか入っていません。 [ruby-core:53552] [Bug #8125]

drbrain:r39891 2013-03-24 03:35:23 +0900

r39890 の本体です。 Rinda::TupleSpaceProxy で tuple が喪失することがある不具合の修正です。 Rinda::TupleSpace は TupleSpace から tuple を取り出す時にクライアント側のオブジェクトを dRuby の参照(DRbObject)にして TupleSpace から移動することで take の失敗による tuple 喪失を防いでいますが、この時に dRuby 経由で push された時にプロセスは生きていても実行していた Thread が例外などで move 待ちの状態から抜けていたら処理が行われないのに tuple は移動されてしまって喪失するので、Rinda::TupleSpaceProxy::Port というクラスを導入して対象の Thread が待ちから抜けてたら move に失敗するようにしています。 まあこれでも非同期シグナルによる割り込みだと厳密にはタイミングによって喪失の可能性を完全になくせるわけではないとは思いますが。 [ruby-core:53552] [Bug #8125]
あとテストで SIGTERM を使っているところは Windows では動くんでしたっけ。SIGINT と SIGKILL だけエミュレートしてたような。

drbrain:r39892 2013-03-24 04:13:37 +0900

r39891 のテストの DRb.stop_service のせいでテストが失敗していたそうで消しています。最後の ensure での掃除も消してしまっていいのかなぁ。

naruse:r39893 2013-03-24 04:50:47 +0900

ext/bigdecimal/bigdecimal.c の未初期化変数の参照の警告を除去するため goto 文をやめてエラー処理を各々の場所に書くようにリファクタリングしています。

naruse:r39894 2013-03-24 04:50:49 +0900

r39883 で KNOWNBUG.rb に追加したテストが無限ループするように書かれていたので SEGV しないとテストから抜けられなくなっていたためタイムアウトを追加しています。 [Bug #8100]

drbrain:r39895 2013-03-24 05:10:11 +0900

Rinda::RingFinger および Rinda::RingServer に multicast 機能を追加しています。 Ring は TupleSpace を使ったネームサーバのようなものです*1。サーバが複数のアドレスに同時に bind できるようにしたことと、 multicast アドレスへの bind に対応したようです。あんまりちゃんと読んでないです。 [ruby-core:53300] [Feature #8073]
しかしこれ Rinda のテストをごっそりとコメントアウトしてしまってます。次の r39896 で戻しているようです。 "#" の行コメントだと差分でチェックしずらいので =begin .. =end のほうがいいですね、ということに今気がつきました。

drbrain:r39896 2013-03-24 05:32:59 +0900

r39895 でコメントアウトしてしまっていた Rinda のテストを戻しています。

drbrain:r39897 2013-03-24 05:36:42 +0900

r39895 の続き。 Rinda::RingServer の multicast サポートについて rdoc に追記しています。

nobu:r39898 2013-03-24 09:04:43 +0900

r39874 の変更でもう使用されなくなっていた load.c の rb_feature_p() のローカル変数を削除しています。 [ruby-core:53216] [Bug #8048]

akr:r39899 2013-03-24 11:06:32 +0900

テストで使われている Tempfile の明示的な削除を追加しています。

nari:r39900 2013-03-24 13:20:32 +0900

LazySweep が禁止されている状態(ObjectSpace.each_object が呼ばれている時は LazySweep は禁止されています)ではヒープの追加が行われないため充分に空きスロットがない状態では GC が頻発してしまう不具合を修正しています。なるほど。ところで return の型が揃ってないようです。と思ったら r39902 で修正されていました。

nari:r39901 2013-03-24 13:53:44 +0900

LazySweep の on/off を制御するマクロ GC_ENABLE_LAZY_SWEEP を導入しています。通常は on です。ついに LazySweep を off にできるようになったんですね。 LazySweep そのものが悪いわけじゃないと思うんですが、mark 処理のバグや sweep の順序やタイミングによる潜在的な不具合が誘発されやすいなどの理由でデバッグ用に LazySweep を切りたいという動機があってこのマクロの導入に到ったようです*2[Feature #8024] [ruby-dev:47135]

nobu:r39902 2013-03-24 14:13:54 +0900

r39900 の return のエラーを修正しています。

knu:r39903 2013-03-24 18:32:06 +0900

String#rpartition にマルチバイト文字を含む文字列で引数が正規表現の時の不具合を修正しています。 [ruby-dev:47183] [Bug #8138]

nobu:r39904 2013-03-24 19:43:37 +0900

vm_method.c の rb_sweep_method_entry() で linked list の要素を削除するコードのリファクタリング

nobu:r39905 2013-03-24 19:43:39 +0900

test-all 用のユーティリティの assert_ruby_status で標準出力の内容をメッセージに含めるようにして、 assertion のメッセージを FailDesc というこの後で定義されている Proc オブジェクトで作るようにしています。 FailDesc は主に signal での終了をケアしていて status が非0の時に status が出力されなくなっているようです。

naruse:r39906 2013-03-24 22:18:54 +0900

r39903 による String#rpartition の修正を revert して、正規表現の match した位置をバイト単位の表現から文字単位(マルチバイト文字を考慮)した表現に変換することで再修正しています。 [ruby-dev:47183] [Bug #8138]

nagachika:r39907 2013-03-24 23:08:08 +0900

r39892 の ChangeLogtypo を修正。

naruse:r39908 2013-03-24 23:36:26 +0900

r39896 で戻した Rinda のテストのうち r39895 で追加した Rinda::RingServer の multicast 対応についてのテストで Rinda::RingFinger#multicast_interface に指定するネットワークインタフェース番号を 1固定にしていたのを IPv6 multicast を利用可能なインタフェースを検索するようにしています。

*1:一瞬 DRb::ExtServ と混同していたのは内緒

*2:バグの内容については単にわたしの経験からの推論なので、実際に今おきている内容とは異なるかもしれません