Hi I'm encountering a problem with the code in the debugger. The
scenario bellow[1] always (practically) deadlocks when running under
JRuby(latest trunk), since server_socket.gets and server_socket.puts
uses the same monitor. The monitor is first acquired by blocking .gets
so .puts does not have chance to acquire it and send message to the
client which would in turn releases the .gets in server -> deadlock.
However under native Ruby it does not deadlock. Probably .gets and .puts
does not uses the same monitor(?).
Is this a bug or just bad usage? For now I can workaround in JRuby with
something like:
class TCPSocket
def non_blocking_gets
loop do
result, _, _ = IO.select( [self], nil, nil, 0.2 )
next unless result
return result[0].gets
end
end
end
m.
[1]
mutex = Mutex.new
connected = ConditionVariable.new
# wait for start command
server_socket = nil
server_reader = Thread.new do
mutex.synchronize do
connected.wait(mutex)
end
while result = server_socket.gets
$stderr.printf "client said: #{result}"
end
end
Thread.new do # server_writer
server = TCPServer.new('127.0.0.1', 1234)
server_socket = server.accept
mutex.synchronize do
connected.signal
end
sleep 0.5
server_socket.puts("hello from server")
end
Thread.new do # client
client_socket = nil
20.downto(1) do |i|
begin
client_socket = TCPSocket.new("127.0.0.1", 1234)
break
rescue Errno::ECONNREFUSED
sleep 0.2
end
end
$stderr.printf "server said: #{client_socket.gets}"
client_socket.puts("hello from client")
client_socket.close
end
server_reader.join
---------------------------------------------------------------------
To unsubscribe from this list please visit:
http://xircles.codehaus.org/manage_email