From: Yusuke ENDOH Date: 2010-02-09T22:23:04+09:00 Subject: [ruby-dev:40371] Re: [Bug:trunk] TCPServer#gets gets stuck 遠藤です。 2010年2月5日0:18 Yusuke ENDOH : > 単一スレッドの状態で 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