Hatena::ブログ(Diary)

PB memo このページをアンテナに追加 RSSフィード

2014-04-24 ruby-trunk-changes r45693 - r45711

[][]ruby-trunk-changes r45693 - r45711

今日は LazySweep している状態で Symbol GC のための Symbol の検索が死んだ(死につつある) Symbol オブジェクトを取り出してしまう不具合についての修正や、tmpdir.rb で require "etc.so" するところの例外捕捉をやめる変更などがありました。

naruse: r45693 2014-04-24 05:59:03 +0900

r45492 の rb_str_dynamic_intern() の修正と同様に SymbolGC の導入時に LazySweep で mark されなかったけどまだ sweep されていない Symbol を見てしまうことを考慮して dsym_node_gen() でも rb_gc_resurrect() でみつけた Symbol を復活させるようにしています。

svn: r45694 2014-04-24 05:59:09 +0900

version.h の日付更新。

nobu: r45695 2014-04-24 09:35:34 +0900

File::Statfs#inspect を追加してメンバの情報を表示するようにしています。

naruse: r45696 2014-04-24 10:01:18 +0900

r45683 で File#seek の SEEK_HOLE/SEEK_DATA に対応しているかのチェックで `uname -r` の結果をチェックしているところで文字列のまま数値と比較しようとしていたので to_i で整数化して比較するように修正しています。

nobu: r45697 2014-04-24 11:04:29 +0900

r45492 で mark されなくて sweep 前の Symbol を使ってしまうのと rb_gc_resurrect() を呼ぶ修正の条件分岐を !STATIC_SYM_P(sym) でなくて ID_DYNAMIC_SYM_P(id) を使うようにしています。少し効率的にしているそうです。

nobu: r45698 2014-04-24 11:04:33 +0900

r45693 の dsym_node_gen() での rb_gc_resurrect() は revert して rb_pin_dynamic_symbol() で Symbol を pin down する時に復活させるように移動しています。

naruse: r45699 2014-04-24 11:16:38 +0900

r45492、r45693、r45698 の Symbol GC と LazySweep の組み合わせで sweep 予定の Symbol を復活させる修正についてのテストを追加しています。

nobu: r45700 2014-04-24 11:21:38 +0900

同じく Symbol GC がらみで rb_sym2id() と rb_sym2id_without_pindown() で渡された VALUE が Symbol じゃない時に 0 を返すようにしています。はて? "for the time being" (差し当たりは) ってあるので、おそらくどこかに不具合があってここで Symbol がくるはずなのに来てないことがあるから work around としてやってるってことではないかと思います。

nobu: r45701 2014-04-24 11:53:29 +0900

拡張ライブラリ opensslOpenSSL::ASN1.new の第3引数 tagging に Symbol でない値を渡すと SYM2ID() を呼んでしまっていたのでチェックしてから呼ぶように修正しています。 r31699 の修正ということですが 2011年のコミットなので現行のバージョンは全て影響しそうですね。 [ruby-core:62142] [Bug #9771]

nobu: r45702 2014-04-24 12:08:49 +0900

r45700 の rb_sym2id() や rb_sym2id_without_pindown() で Symbol 以外の VALUE が渡された時の挙動を 0 を返すのではなくて TypeError 例外を発生させるようにしています。

nobu: r45703 2014-04-24 13:24:56 +0900

lookup_id_str() のところで渡された Symbol (id) とその参照する fstring も rb_gc_resurrect() で復活させるようにしています。

naruse: r45704 2014-04-24 17:46:56 +0900

r45695 で追加した File::Statfs#inspect の実装でフォーマット文字列のバイト幅を指定する修飾子を修正したり明示的なキャストを追加して警告除去しています。

naruse: r45705 2014-04-24 17:47:29 +0900

同じく r45695 で追加された File::Statfs#inspect のテストで assert_match のメソッド呼び出しをかっこ就きにして警告除去。

naruse: r45706 2014-04-24 17:47:47 +0900

File#seek の SEEK_DATA のテストで不要になったローカル変数を削除して警告除去しています。

akr: r45707 2014-04-24 20:53:31 +0900

標準添付ライブラリ tmpdir で拡張ライブラリ etc を require しているところを begin .. rescue LoadError で囲んで etc がビルドされなかった場合を考慮していたのをやめています。 r45692 で常に etc をビルドするようにしたので不要になったということでしょう。けどここ "etc.so" と拡張子が決め打ちで書かれているので特定の環境のみっぽい…と思いきや Mac OS X では require "etc.so" でもちゃんと etc.bundle がロードされるので ".so" は拡張ライブラリを指定する拡張子として扱われてるみたいですね。ちょっと load.c を覗くと、".so", ".o" と RbConfig::CONFIG["DLEXT"] がどれも拡張ライブラリを明示的に指定するために使えるようなので環境によらず ".so" は使えそうですね。

kazu: r45708 2014-04-24 21:11:01 +0900

man ruby に記述されていた contributor 一覧の Wiki のリンクが古くなっていたので修正しています。

akr: r45709 2014-04-24 22:40:18 +0900

r45707 の tmpdir.rb の require "etc.so" の例外についてと関連していると思いますが bootstraptest/test_io.rb で tmpdir で追加される Dir.tmpdir を利用していたのをやめて "/tmp" 固定にしています。make test は miniruby で動き、拡張ライブラリはロードできないからだろうと思います。

akr: r45710 2014-04-24 22:54:07 +0900

r45709 を revert しています。一時ディレクトリを /tmp に固定してしまったのは、特に Windows 環境ではよくなかったので別の対策を次で打ってます。

akr: r45711 2014-04-24 22:56:09 +0900

bootstraptest/test_io.rb で require "tmpdir" する前に $" ($LOADED_FEATURE) に "etc.so" をつっこむことで lib/tmpdir.rb の require "etc.so" がエラーにならないようにするハックで miniruby で tmpdir.rb を利用できるようにしています。ちなみに Windows では環境変数 TEMP があるのでそれから取得するように tmpdir.rb が実装されているので、ポータブルに一時ディレクトリを得たい場合は tmpdir.rb の Dir.tmpdir を使うのが正解だそうです。

2014-04-23 ruby-trunk-changes r45666 - r45692

[][]ruby-trunk-changes r45666 - r45692

今日は昨日追加された File#statfs や File::Statfs の修正や StringIO#write が書き込む文字列の taint フラグを内部の string に伝播させていなかった不具合修正などがありました。

naruse: r45666 2014-04-22 21:55:16 +0900

r45662 や r45664 のメッセージ埋め込みで SEEK_DATA の使えないファイルシステム(というか使えるファイルシステム)が判明したようで利用できるファイルシステムかチェックしてから File#seek のテストをするようにしています。

naruse: r45667 2014-04-22 21:57:38 +0900

r45661 で導入した File::Statfs の定義部分を #ifdef HAVE_STRUCT_STATFS ... #endif で括って struct statfs がない環境ではビルドしないようにしています。

usa: r45668 2014-04-22 22:19:15 +0900

同じく r45661 で導入した IO#statfs も fstatfs(2) がない環境では NotImplementedError を発生させるようにしています。またテストもスキップするようにしています。

nobu: r45669 2014-04-22 23:01:51 +0900

r45661 で追加の File::Statfs の実装 statfs_fsid() で aliasing の警告除去のため型の変換を共用体を使った実装に変更しています。

nobu: r45670 2014-04-22 23:14:30 +0900

拡張ライブラリ stringio で taint された文字列を書き込んだ時に内部のバッファ用 String オブジェクトに汚染フラグが伝播しない不具合を修正しています。 rb_str_append() を使って文字列連結するようにしています。 が、後で(r45674)これは revert されています。 [ruby-dev:48118] [Bug #9769]

usa: r45671 2014-04-22 23:57:18 +0900

r45661 で追加の IO#statfs の実装で fstatfs(2) が利用できない場合は statfs(2) で開いているファイルのファイルパスで呼ぶようにしています。うーんしかし fptr->pathv が Qnil の時もあるんじゃないでしょうか。

usa: r45672 2014-04-23 00:45:00 +0900

r45661 で追加の IO#statfs の Windows 対応の実装を追加しています。 GetVolumePathNameW()/GetVolumeInformationW()/GetDiskFreeSpaceW() などの API を利用してエミュレーションしています。filesystem type は 0 固定になっています。

svn: r45673 2014-04-23 00:45:07 +0900

version.h の日付更新。

naruse: r45674 2014-04-23 03:44:48 +0900

r45670 の stringio の taint フラグ伝播の修正を revert しています。 test-all が失敗していたため。

nobu: r45675 2014-04-23 11:03:24 +0900

misc/ruby-additional.el に C-c C-u で選択範囲の非 ASCII 文字を \u{} の Unicode記法に変換する機能を追加しています。

nobu: r45676 2014-04-23 11:03:35 +0900

拡張ライブラリ stringio の r45670 とそれを revert した r45674 の続きで、書き込む(追加する)文字列GC マーク漏れを防ぐためのコンパイラ最適化避けの RB_GC_GUARD() が前のほうにあるのを利用した後に移動しています。

nobu: r45677 2014-04-23 11:03:43 +0900

これも r45670 とそれを revert した r45674 の続きで拡張ライブラリ stringio で、追記する文字列エンコーディングが ASCII_8BIT の時はこれまで通り rb_enc_str_buf_cat() で追加してから OBJ_INJECT() で書き込む文字列の汚染フラグを伝播させるようにして、それ以外は rb_str_buf_append() を利用するようにしています。 [ruby-dev:48118] [Bug #9769]

nobu: r45678 2014-04-23 11:32:17 +0900

r45661 で追加の File::Statfs で fsid_t という型が定義されていない環境を考慮するようにしています。

naruse: r45679 2014-04-23 11:41:54 +0900

r45666 で File#seek の SEEK_DATA を使えるファイルシステムかどうかチェックするところで ext3ext4 は File::Statfs#type では区別がつかないそうで、 mtime/atime/ctime の精度で ext4 以上を検出するようにしています(ext3 までは精度が秒までなので nsec が 0 のはず。たまたま ext4 でも 0 にならないとも限らないですが)。

usa: r45680 2014-04-23 11:47:07 +0900

r45678 の fsid_t の型の有無をチェックするようにしたのに Windows 環境の win32/Makefile.sub での configh.h 生成も追随しています。

nobu: r45681 2014-04-23 11:51:34 +0900

拡張ライブラリ win32ole の LCID や EXCEPINFO.scode の文字列化する時のフォーマットの指定を修正しています。

naruse: r45682 2014-04-23 12:26:42 +0900

r45679 のファイルシステム検出の ext4 対応の修正変数typo 修正

naruse: r45683 2014-04-23 12:53:53 +0900

r45679 の SEEK_DATA が使えるファイルシステム検出の条件をさらに詳細にして、`uname -r` で Linux のバージョンを取得して SEEK_DATA が利用可能になっているバージョン(ファイルシステムごとに違うようです)までみて判定するようにしています。

nobu: r45684 2014-04-23 13:14:42 +0900

r45681 の win32ole のフォーマット文字列のサイズ指定修正に対応して渡す変数の型も環境によって揺らぎがあるそうなので明示的にキャストして渡すようにしています。

nobu: r45685 2014-04-23 13:31:09 +0900

struct statfs の fsid メンバの扱いを rb_integer_unpack() を使って整数化するように変更しています。

naruse: r45686 2014-04-23 13:31:56 +0900

Travis-CI での make test-all で lib/test/unit.rb の minitest.gem のバージョン指定がエラーになるのを回避するために gem "minitest", "< 5.0.0" で発生した Gem::LoadError を rescue して無視するようにしています。

naruse: r45687 2014-04-23 13:48:52 +0900

.travis.yml で実行前に `uname -a` と `cat /proc/version_signature` を実行して実行環境の情報を表示するようにしています。

naruse: r45688 2014-04-23 14:01:05 +0900

Travis-CI の環境には /proc/version_signature が存在しなかったようで r45687 を部分的に revert しています。

naruse: r45689 2014-04-23 14:25:12 +0900

struct statfs の f_fsid の値は File::Statfs には見せないように変更(削除)しています。 f_fsid が環境によって型が違っていて値が取れても利用しにくいのでとりあえずこのままでは意味がなさそう、ということのようです。 参考URL: http://togetter.com/li/658517

naruse: r45690 2014-04-23 14:31:08 +0900

.travis.yml に実行する環境の表示に uname -r を追加しています。 uname -a でバージョンも表示されると思うのですがなぜだろう…

naruse: r45691 2014-04-23 15:05:30 +0900

ファイルシステムによって File#seek の SEEK_DATA が使えるかの判定を利用して SEEK_HOLE のテストでも skip するようにしています。

akr: r45692 2014-04-23 20:53:07 +0900

拡張ライブラリ etc の extconf.rb が getlogin()、getpwent()、getgrent() のいずれかが存在するか RbConfig::CONFIG["sysconfdir"] が nil でない時だけ Makefile を生成するようになっていたのを常にビルドはするようにしています。

2014-04-22 ruby-trunk-changes r45653 - r45665

[][]ruby-trunk-changes r45653 - r45665

今日は realloc() 時の GC 実行タイミングについての変更がありました。実は core でも realloc() で GC が走らないことを期待しているコードがあるそうで、ちょっと意外でした。また IO#statfs の追加と struct statfs をラップする File::Statfs というクラスが導入されています。

nobu: r45653 2014-04-22 06:53:48 +0900

xrealloc() でメモリ確保時に GC.stress が設定されていたら GC 実行するようにしています。 へー realloc のときは GC.stress による強制 GC は実行されてなかったんですね。 [ruby-core:62103] [Feature #9761] が、これは意外に影響が懸念されているようでささださんが [ruby-dev:48117] で revert か変更の再修正を提言しています。 GC.stress による GC が行われるだけでなくて、malloc_increase による圧力GC 実行も xrealloc() で起きるようになり、実は xrealloc() では GC が発生しないという前提で書かれてしまっている部分があってそこでマーク漏れが発生してしまうんだそうです。えーそうだったのか…。

svn: r45654 2014-04-22 06:53:56 +0900

version.h の日付更新。

nobu: r45655 2014-04-22 06:54:17 +0900

GC.stress のビットフラグに 0x04 を追加して malloc/calloc/realloc 後に full mark するという設定を増やしています。 ただなんというかこのフラグの意図がよくわからなかったです… [ruby-core:62103] [Feature #9761]

ko1: r45656 2014-04-22 08:37:18 +0900

r45653 の修正で xrealloc() の後の GCGC.stress によるものだけ起動するようにして、malloc_increase の圧力によるものはこれまでどおり malloc()/calloc() の後だけ実行するようにしています。 ただ GC.stress 時に 2回 garbage_collect_with_gvl() が呼ばれる可能性があるのがちょっと気になります。 [ruby-dev:48117]

naruse: r45657 2014-04-22 10:07:29 +0900

.travis.yml のテスト対象のブランチに ruby_2_0_0、ruby_2_1、ruby_2_2 を追加しています。あれ、ruby_2_2 なんてあったっけ、と思ったけどやっぱりまだなかったです。

naruse: r45658 2014-04-22 10:38:13 +0900

.travis.yml で make test-all の TESTS 変数で渡すオプションに -q と -j2 を追加しています。

nobu: r45659 2014-04-22 11:27:17 +0900

hole(データがない領域)をもつファイルの File#seek の SEEK_DATA (hole をスキップしてデータのある部分だけで seek する)と SEEK_HOLE (hole の位置を基準に探す)を使った場合のテストケースを追加しています。

akr: r45660 2014-04-22 18:52:06 +0900

NEWS ファイルに r45634 などで変更された rb_big_new() や rb_num2long(), rb_num2ulong() などの関数の型の変更について非互換リストに追加しています。

naruse: r45661 2014-04-22 19:35:57 +0900

fstatfs(2) を呼び出す IO#statfs メソッドが追加され、結果の struct statfs をラップする File::Statfs というクラスも導入されています。

naruse: r45662 2014-04-22 19:37:01 +0900

r45659 で追加した hole のあるファイルの File#seek のテストケースで、ファイルシステムによっては SEEK_DATA が使えないことがあるようでエラーメッセージに利用したファイルシステムの種類を含めるようにしています。

naruse: r45663 2014-04-22 19:59:38 +0900

r45661 の File::Statfs での関数typo 修正

naruse: r45664 2014-04-22 20:46:24 +0900

r45662 の File#seek で SEEK_DATA を使うときのテストのメッセージへのファイルシステム追加ですが File#read のところに入れてしまっていたので File#seek で例外が発生しないことをチェックしてそこのメッセージに埋め込むように再修正しています。

kazu: r45665 2014-04-22 21:32:01 +0900

r45650 の ChangeLogtypo 修正

2014-04-21 ruby-trunk-changes r45644 - r45652

[][]ruby-trunk-changes r45644 - r45652

今日は拡張ライブラリ stringio の StringIO#putc の不具合修正文字列の coderange 判定の処理の効率化などがありました。

nobu: r45644 2014-04-21 09:39:43 +0900

RGenGC の導入により GC.stress= にセットする値がただの真偽値でなく major GC や LazySweep の挙動を指定するビットフラグになっているのを内部的に定数を定義してマジックナンバーをソース内に埋め込まないようにしています。 また rdoc 用コメントにも追記しています。

svn: r45645 2014-04-21 09:39:47 +0900

version.h の日付更新。

nobu: r45646 2014-04-21 14:11:50 +0900

拡張ライブラリ stringio の StringIO#putc で非ASCII文字の時に文字のバイト幅を考慮せずに 1バイト追加していたのをエンコーディングを意識するように修正しています。 [ruby-dev:48114] [Bug #9765]

nobu: r45647 2014-04-21 17:31:30 +0900

string.c の rb_str_update() と rb_str_splice() が同じ実装だったのを wrapper 関数として定義していたのを関数マクロとして別名定義するようにしています。 これは RUBY_ALIAS_FUNCTION() は使わないんですかね。

[追記] static 関数なので RUBY_ALIAS_FUNCTION() を使わなかったとのことでした。[/追記]

naruse: r45648 2014-04-21 19:14:43 +0900

string.c の coderange_scan() で code range の推定で、絶対に真にならない条件の分岐があったのを消しています。

naruse: r45649 2014-04-21 19:14:46 +0900

文字列操作の coderange 回りのテスト用の拡張ライブラリ文字列キャッシュされた coderange も取れるようにしてスキャンは明示的に呼ぶようにしてより内部的な状態をテストするようにしているようです。

naruse: r45650 2014-04-21 19:15:20 +0900

r45648 と同じく string.c の coderange_scan() をリファクタリングしてループと条件分岐の構造をシンプルにしています。

naruse: r45651 2014-04-21 19:15:54 +0900

string.c の coderange_scan() で ASCII_8BIT の encindex を 0 固定で判定していたのを rb_ascii8bit_encindex() で判定するようにしています。 また rb_str_coderange_scan_restartable() でエンコーディングが ASCII_8BIT の時の coderange のスキャンで既に ENC_CODERANGE_VALID が返されてた時(非ASCII文字を検出していた時)はすぐ末尾までスキップするようにしています。

nobu: r45652 2014-04-21 19:16:06 +0900

r45649 で新規追加したファイル test/-ext-/string/test_coderange.rb の svn property を設定しています。

2014-04-20 ruby-trunk-changes r45638 - r45643

[][]ruby-trunk-changes r45638 - r45643

normal: r45638 2014-04-20 06:24:45 +0900

RGenGC で minor GC の回数を減らすために大きなサイズの Array や Hash はその Array/Hash オブジェクト自体でなく参照先のほうを remember set に登録するように特別扱いしていましたが、それにより大きな Array や Hash を操作するとメモリ消費量が大きくなる(GC が走らない)のでやめています。 [ruby-core:60699] [Bug #9518]

svn: r45639 2014-04-20 06:24:49 +0900

version.h の日付更新。

nobu: r45640 2014-04-20 08:41:36 +0900

標準添付ライブラリ mkmf.rb で linker のチェックをする際に利用する変数の $LIBPATH と $DEFLIBPATH の優先順位を修正して $LIBPATH のほうを優先して参照するようにしています。 [ruby-core:62100] [Bug #9760]

nobu: r45641 2014-04-20 09:12:15 +0900

拡張ライブラリ win32ole のいくつかの関数引数の型を long から LONG に変更してコンパイラ警告を抑制しています。 LONG という型を宣言しているところがみあたらなかったので多分 Win32OLE での型でしょう。いくつか呼んでいる Windows 独自の関数を(SafeArrayPutElement とか SafeArrayGetDim)を調べてみたけどその型は long を使っていたので、多分実際には long と同じなのではないかと思います。

tarui: r45642 2014-04-20 12:58:22 +0900

Hash#each などのメソッドのブロック内で callcc で Continuation を生成して後からブロック内に再入した時のために、pack された Hash オブジェクトの場合インデックスを毎回 find_packed_index_from() で再計算しているのですが、このために Hash のキーに Array など破壊的変更のできるオブジェクトを利用して、格納した後でその内容を変更して hash & eql で同一と判定されるキーが2つある状態にすると、インデックスが先に進まなくなってしまって無限ループする不具合を解消しています。 インデックス再計算をしている時に現在のオフセットからの再計算にすることで後戻りを防いでいます。 callcc での再入でイレテータを戻すことはできなくなりますが、まあ同一キーを作ってしまうケースと比較してどっちがありそうかってことでしょうか。 [ruby-dev:48047] [Bug #9646]

なお callcc を生で使うのは推奨されません。大抵の場合 Fiber で代替できるでしょう。

nobu: r45643 2014-04-20 19:31:29 +0900

r45642 の ChangeLog エントリの typo 修正