From: Alex Young Date: 2011-02-12T01:19:17+09:00 Subject: [ruby-core:35203] [Ruby 1.9-Bug#4390][Open] TCPSocket#readline doesn't raise if the socket is #close'd in another thread Bug #4390: TCPSocket#readline doesn't raise if the socket is #close'd in another thread http://redmine.ruby-lang.org/issues/show/4390 Author: Alex Young Status: Open, Priority: Normal Category: core, Target version: 1.9.2 ruby -v: ruby 1.9.2p136 (2010-12-25 revision 30365) [i686-linux] In Ruby 1.8.7-p302, the following code outputs "Success!". On 1.9.2-p136, it hangs at q.pop, because the blocked readline doesn't raise (or, more precisely, it does, I think, but the thread isn't woken up to process it). require 'socket' require 'thread' server = TCPServer.new("localhost", 0) serv_thread = Thread.new{ server.accept } sleep(0.1) sock = TCPSocket.new("localhost", server.addr[1]) q = Queue.new client_thread = Thread.new{ begin sock.readline q.push "OK" rescue StandardError => e p e q.push(e) end } sleep(0.1) while client_thread.status == "run" sock.close err = q.pop puts "Success!" It's not immediately clear which is the correct behaviour, but I'm raising an issue against 1.9.2 on the principle that unless there was a conscious decision to change behaviour, a change indicates that something broke. I should also add that this behaviour is *not* observed in i386-cygwin. ---------------------------------------- http://redmine.ruby-lang.org