遠藤です。

2010年2月5日0:18 Yusuke ENDOH <mame / tsg.ne.jp>:
> 単一スレッドの状態で TCPServer#gets を呼ぶと Errno::ENOTCONN が
> 投げられますが、複数のスレッドがいる状態だと接続があるまでブロック
> します。
>
>  Thread.new { sleep }
>  TCPServer.new(0).gets
>
> 原因は gets が読み込みを行う前に (rb_thread_wait_fd 経由で) select
> を行うことです。
> io.c の READ_CHECK の中で rb_thread_wait_fd を呼ぶ必要はあるので
> しょうか。「windows で必要」との akr さんのお告げがあったので、
> _WIN32 以外では呼ばないようにするパッチを作ってみました。


直接的な反対はないようなので、一旦コミットします。

といってもこのパッチで正しいかどうかはかなり自信ないので、IO
周りで変とか固まるとかになったら、この件を疑ってください。

akr さんの指摘する問題 (windows と 1.8) は残るので、よりよい
解決策の提案を待っています。

-- 
Yusuke ENDOH <mame / tsg.ne.jp>