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; }