ruby-trunk-changes r37384 - r37388

今日は Thread#thread_variable_get/set などのメソッドで Thread Local Storage を操作するメソッドが追加されています。

tenderlove:r37384 2012-10-30 02:22:36 +0900

Thread#[ ] や Thread#[ ]= で Thread にキーと値のペアを記録できる機能を Thread Local Storage と呼んでいますが、これは実際には Fiber 毎に保存されるので Fiber Local Storage として機能しています。 また Enumerator は内部で Fiber を利用しているため、Enumerator のブロック内で Thread Local Storage を利用すると呼び元と同じ値が取得できないという問題があり、本当に Thread Local な値の取得/格納のために Thread#thread_variable_get, thread_variable_set というメソッドを追加しています。 また Thread#thread_variables で現在格納している変数名(キー)のリストを返すようにしています。 Thread#thread_variable?(key) で特定のキーが保存されているかをチェックするメソッドも用意されています。 [ruby-core:47790] [Bug #7097]
実装としては Thread に "locals" という名前のインスタンス変数*1に Hash オブジェクトを格納してそこに値を入れるようにしています。 struct RBasic::klass をクリアして ObjectSpace から隠したほうがいいかもしれませんが、そのためには利用する関数を調整しないといけないかもしれませんね(rb_hash_aref() で default_proc の呼び出しがあるので r37066 のように rb_hash_lookup() を使うとか)。

svn:r37385 2012-10-30 02:22:45 +0900

version.h の日付更新。

nobu:r37386 2012-10-30 03:08:56 +0900

r36330 で lib/rbconfig/obsolete.rb を RbConfig::Obsolete を削除したのを過去の互換性のために復活させています。 [ruby-core:46836] [Bug #6809]

naruse:r37387 2012-10-30 09:40:54 +0900

Windows や *BSD 環境で Socket の connect_nonblock で localhost に接続する場合、一旦 EINPROGRESS を返してから select(2) などでチェックした後で再度 connect_nonblock を呼ぶと errno=EINVAL で返ってくるので、その前に Socket#getsockopt を使って明示的にエラーを検出してチェックするようにしています。多分テストがエラーになること自体は避けていなくて、エラー内容がわかるような assert を追加しているのだと思います。 [ruby-dev:43181] [Bug #4387]

usa:r37388 2012-10-30 19:32:56 +0900

Windows 版で rubyw.exe を使って端末(コマンドプロンプト)を伴わないプロセスを使っている時に、 dup2() で標準入出力用(0, 1, 2)の file descriptor を置き換えた時に、起動した子プロセスにそれが伝播しないらしく、明示的に SetStdHandle() という関数を呼んで File handle に対応づけているようです。 Windows の作法はよくわかりませんがこうしないと `cmd` などでコマンドの出力結果を取得できないようです。 [ruby-core:48542] [Bug #7239]

*1:"@" で始まっていないので Ruby からはアクセスできない内部用の変数