class EventMachine::Synchrony::TCPSocket

def handle_read(type, num_bytes, dest=nil)

def handle_read(type, num_bytes, dest=nil)
  # read(-n) always raises ArgumentError
  # recv(-n) always raises ArgumentError
  raise ArgumentError, "negative length #{num_bytes} given" if num_bytes != nil and num_bytes < 0
  # read(n) on a socket after #close, raises IOError with message "closed stream"
  # read(0) on a socket after #close, raises IOError with message "closed stream"
  # read() on a socket after #close, raises IOError with message "closed stream"
  # recv(n) on a socket after #close, raises IOError with message "closed stream"
  # recv(0) on a socket after #close, raises IOError with message "closed stream"
  raise IOError, "closed stream" if @closed
  # read(0) on an open socket, return ""
  # read(0) on a remotely closed socket, with buffered data, returns ""
  # read(0) on a remotely closed socket, with no buffered data, returns ""
  # recv(0) on an open socket, return ""
  # recv(0) on a remotely closed socket, with buffered data, returns ""
  # recv(0) on a remotely closed socket, with no buffered data, returns ""
  return "" if num_bytes == 0
  @read_type  = type
  @read_bytes = num_bytes
  @read_dest  = dest if dest
  
  (data = read_data) != :block ? data : sync(:in)
end