A
Alex Young
Take the following code:
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
rescue StandardError => e
q.push(e)
end
}
sleep(0.1) while client_thread.status == "run"
sock.close
# client_thread.wakeup rescue nil
err = q.pop
client_thread.join
fail "Failure!" unless err.is_a?(IOError)
puts "Success!"
So, we've got one thread blocked on a #readline, and another thread
closes the socket out from under it. On 1.8.7-p302, this completes
successfully. On 1.9.2-p136, it hangs at q.pop.
If I uncomment the client_thread.wakeup call, both complete (although
the rescue is necessary to prevent a ThreadError on 1.8.7).
Is this expected? Which is "correct"?
Thanks,
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
rescue StandardError => e
q.push(e)
end
}
sleep(0.1) while client_thread.status == "run"
sock.close
# client_thread.wakeup rescue nil
err = q.pop
client_thread.join
fail "Failure!" unless err.is_a?(IOError)
puts "Success!"
So, we've got one thread blocked on a #readline, and another thread
closes the socket out from under it. On 1.8.7-p302, this completes
successfully. On 1.9.2-p136, it hangs at q.pop.
If I uncomment the client_thread.wakeup call, both complete (although
the rescue is necessary to prevent a ThreadError on 1.8.7).
Is this expected? Which is "correct"?
Thanks,