2011年5月12日15:29 U.Nakamura <usa / garbagecollect.jp>:
> こんにちは、なかむら(う)です。
>
> In message "[ruby-dev:43513] Re: draft schedule of Ruby 1.9.3"
>    on May.10,2011 19:07:57, <kosaki.motohiro / gmail.com> wrote:
>>  10) Failure:
>> test_wait_for_invalid_fd(TestWaitForSingleFD)
>> [c:/ruby/trunk/test/-ext-/wait_for_single_fd/test_wait_for_single_fd.rb:27
>> ]:
>> Errno::EBADF expected but nothing was raised.
>>
>> これは、僕が最近いれたEricの io/wait テストなんですが、Windowsでの正しい動作が不明なので usa さんの見解が欲しい。
>
> えーと、テストを見ると、closeされたfdに対してwaitしたら例外が
> 起きてほしい?
>
> そもそもselect(2)はcloseされたfdを渡されてもEBADFにはなんない
> ですよね? 違いましたっけ?

Linux および POSIX準拠 なシステムはEBADFになります。補足する過去に議論になったのは

1) そもそも別スレッドが同時にopenしたら、もう無効fd じゃなくなってしまうのだから拡張ライブラリはEBADFを仮定するべきではない
2) Linux特有の制限として、先にselectして別スレッドがcloseしたときにselectは起床しない
     (なぜならリファレンスカウント内部的に一個上がってしまってるから検知できぬ)

で、これは非公開API をむりやりテストしてるテストケースなので、poll と select で差異が出ないことを確認することが主眼になってるんです。
そのことの是非はさておくとして、基本的にテストはよほどアレじゃないかぎりマージしてやってもよかろうと思うのでマージしちゃいました。(test/-ext-
なんてアレゲテストの巣窟なんから今更細かいことを言ってもねぇ・・とかとか)


> そういう仕様がお望みならselect_single()あたりをそういう挙動に
> 変えないといかんのではないかと思いますけど...
>
> なお、poll(2)版も自前でPOLLNVALをEBADFに変換した上でRuby例外
> にしてるようですが、どうせ例外投げるならIOErrorの方がいいんじ
> ゃないかと私は思います。

という仕様にするとしても、IO.selectのルートを考えると
プラットフォームがEBADFを返したところをキャッチしてIOErrorに変換することになると思います。
もしくは、Windowsだけ例外上がらないことを仕様にして、このテストをスキップさせるか。


# ところで、なんで Windows の select に pipe わたして動いているのか理解出来ないので
# 今度教えてください