Esempio n. 1
0
void Connect(GDBRemoteCommunication &client, GDBRemoteCommunication &server) {
  bool child_processes_inherit = false;
  Error error;
  TCPSocket listen_socket(child_processes_inherit, error);
  ASSERT_FALSE(error.Fail());
  error = listen_socket.Listen("127.0.0.1:0", 5);
  ASSERT_FALSE(error.Fail());

  Socket *accept_socket;
  std::future<Error> accept_error = std::async(std::launch::async, [&] {
    return listen_socket.Accept("127.0.0.1:0", child_processes_inherit,
                                accept_socket);
  });

  char connect_remote_address[64];
  snprintf(connect_remote_address, sizeof(connect_remote_address),
           "connect://localhost:%u", listen_socket.GetLocalPortNumber());

  std::unique_ptr<ConnectionFileDescriptor> conn_ap(
      new ConnectionFileDescriptor());
  ASSERT_EQ(conn_ap->Connect(connect_remote_address, nullptr),
            lldb::eConnectionStatusSuccess);

  client.SetConnection(conn_ap.release());
  ASSERT_TRUE(accept_error.get().Success());
  server.SetConnection(new ConnectionFileDescriptor(accept_socket));
}
lldb::thread_result_t
GDBRemoteCommunication::ListenThread (lldb::thread_arg_t arg)
{
    GDBRemoteCommunication *comm = (GDBRemoteCommunication *)arg;
    Error error;
    ConnectionFileDescriptor *connection = (ConnectionFileDescriptor *)comm->GetConnection ();
    
    if (connection)
    {
        // Do the listen on another thread so we can continue on...
        if (connection->Connect(comm->m_listen_url.c_str(), &error) != eConnectionStatusSuccess)
            comm->SetConnection(NULL);
    }
    return NULL;
}