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

Reply via email to