From: Romulo Ceccon Date: 2009-05-12T03:14:53+09:00 Subject: [ruby-core:23431] [Bug #1460] IO#select returns wrong fd list after Kernel#sleep (Windows) Bug #1460: IO#select returns wrong fd list after Kernel#sleep (Windows) http://redmine.ruby-lang.org/issues/show/1460 Author: Romulo Ceccon Status: Open, Priority: Normal Category: core, Target version: Ruby 1.8.6 ruby -v: ruby 1.8.6 (2008-08-11 patchlevel 287) [i386-mswin32] The following script never ends on Windows XP/Vista: require 'thread' a = IO.pipe puts "pipe: #{a.inspect}" th = Thread.new do if res = IO.select([a[0]], [], [], 1) puts "select ok: #{res.inspect}" c = a[0].read(1) puts "read ok: #{c}" else puts "timeout" end end puts "sleep" sleep(1) puts "done" The main thread stops at "sleep(1)" and the secondary thread at "c = a[0].read(1)". This is the output I get: pipe: [#, #] sleep select ok: [[#], [], []] (ruby freezes here) The Kernel#sleep call makes IO#select return with the pipe handle, even though it hasn't signaled. Then the call to IO#read blocks because no data is available. I couldn't come up with a workaround because IO#read_nonblock does not work with pipes in Windows (raises "Bad file descriptor" (calling IO#fcntl with O_NONBLOCK is also not possible)). ---------------------------------------- http://redmine.ruby-lang.org