Skip to content

Commit

Permalink
[lldb] [Host/ConnectionFileDescriptor] Refactor to improve code reuse
Browse files Browse the repository at this point in the history
Refactor ConnectionFileDescriptor to improve code reuse for different
types of sockets.  Unify method naming.

While at it, remove some (now-)dead code from Socket.

Differential Revision: https://reviews.llvm.org/D112495
  • Loading branch information
mgorny committed Oct 28, 2021
1 parent c45045b commit e50f02b
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 184 deletions.
12 changes: 0 additions & 12 deletions lldb/include/lldb/Host/Socket.h
Expand Up @@ -84,18 +84,6 @@ class Socket : public IOObject {
static llvm::Expected<std::unique_ptr<UDPSocket>>
UdpConnect(llvm::StringRef host_and_port, bool child_processes_inherit);

static Status UnixDomainConnect(llvm::StringRef host_and_port,
bool child_processes_inherit,
Socket *&socket);
static Status UnixDomainAccept(llvm::StringRef host_and_port,
bool child_processes_inherit, Socket *&socket);
static Status UnixAbstractConnect(llvm::StringRef host_and_port,
bool child_processes_inherit,
Socket *&socket);
static Status UnixAbstractAccept(llvm::StringRef host_and_port,
bool child_processes_inherit,
Socket *&socket);

int GetOption(int level, int option_name, int &option_value);
int SetOption(int level, int option_name, int option_value);

Expand Down
32 changes: 21 additions & 11 deletions lldb/include/lldb/Host/posix/ConnectionFileDescriptorPosix.h
Expand Up @@ -16,6 +16,7 @@
#include "lldb/lldb-forward.h"

#include "lldb/Host/Pipe.h"
#include "lldb/Host/Socket.h"
#include "lldb/Utility/Connection.h"
#include "lldb/Utility/IOObject.h"

Expand Down Expand Up @@ -73,9 +74,18 @@ class ConnectionFileDescriptor : public Connection {
void CloseCommandPipe();

lldb::ConnectionStatus
SocketListenAndAccept(llvm::StringRef host_and_port,
socket_id_callback_type socket_id_callback,
Status *error_ptr);
AcceptSocket(Socket::SocketProtocol socket_protocol,
llvm::StringRef socket_name,
llvm::function_ref<void(Socket &)> post_listen_callback,
Status *error_ptr);

lldb::ConnectionStatus ConnectSocket(Socket::SocketProtocol socket_protocol,
llvm::StringRef socket_name,
Status *error_ptr);

lldb::ConnectionStatus AcceptTCP(llvm::StringRef host_and_port,
socket_id_callback_type socket_id_callback,
Status *error_ptr);

lldb::ConnectionStatus ConnectTCP(llvm::StringRef host_and_port,
socket_id_callback_type socket_id_callback,
Expand All @@ -86,24 +96,24 @@ class ConnectionFileDescriptor : public Connection {
Status *error_ptr);

lldb::ConnectionStatus
NamedSocketConnect(llvm::StringRef socket_name,
ConnectNamedSocket(llvm::StringRef socket_name,
socket_id_callback_type socket_id_callback,
Status *error_ptr);

lldb::ConnectionStatus
NamedSocketAccept(llvm::StringRef socket_name,
AcceptNamedSocket(llvm::StringRef socket_name,
socket_id_callback_type socket_id_callback,
Status *error_ptr);

lldb::ConnectionStatus
UnixAbstractSocketAccept(llvm::StringRef socket_name,
socket_id_callback_type socket_id_callback,
Status *error_ptr);
AcceptAbstractSocket(llvm::StringRef socket_name,
socket_id_callback_type socket_id_callback,
Status *error_ptr);

lldb::ConnectionStatus
UnixAbstractSocketConnect(llvm::StringRef socket_name,
socket_id_callback_type socket_id_callback,
Status *error_ptr);
ConnectAbstractSocket(llvm::StringRef socket_name,
socket_id_callback_type socket_id_callback,
Status *error_ptr);

lldb::ConnectionStatus ConnectFD(llvm::StringRef args,
socket_id_callback_type socket_id_callback,
Expand Down
64 changes: 0 additions & 64 deletions lldb/source/Host/common/Socket.cpp
Expand Up @@ -183,70 +183,6 @@ Socket::UdpConnect(llvm::StringRef host_and_port,
return UDPSocket::Connect(host_and_port, child_processes_inherit);
}

Status Socket::UnixDomainConnect(llvm::StringRef name,
bool child_processes_inherit,
Socket *&socket) {
Status error;
std::unique_ptr<Socket> connect_socket(
Create(ProtocolUnixDomain, child_processes_inherit, error));
if (error.Fail())
return error;

error = connect_socket->Connect(name);
if (error.Success())
socket = connect_socket.release();

return error;
}

Status Socket::UnixDomainAccept(llvm::StringRef name,
bool child_processes_inherit, Socket *&socket) {
Status error;
std::unique_ptr<Socket> listen_socket(
Create(ProtocolUnixDomain, child_processes_inherit, error));
if (error.Fail())
return error;

error = listen_socket->Listen(name, 5);
if (error.Fail())
return error;

error = listen_socket->Accept(socket);
return error;
}

Status Socket::UnixAbstractConnect(llvm::StringRef name,
bool child_processes_inherit,
Socket *&socket) {
Status error;
std::unique_ptr<Socket> connect_socket(
Create(ProtocolUnixAbstract, child_processes_inherit, error));
if (error.Fail())
return error;

error = connect_socket->Connect(name);
if (error.Success())
socket = connect_socket.release();
return error;
}

Status Socket::UnixAbstractAccept(llvm::StringRef name,
bool child_processes_inherit,
Socket *&socket) {
Status error;
std::unique_ptr<Socket> listen_socket(
Create(ProtocolUnixAbstract, child_processes_inherit, error));
if (error.Fail())
return error;

error = listen_socket->Listen(name, 5);
if (error.Fail())
return error;

error = listen_socket->Accept(socket);
return error;
}

llvm::Expected<Socket::HostAndPort> Socket::DecodeHostAndPort(llvm::StringRef host_and_port) {
static llvm::Regex g_regex("([^:]+|\\[[0-9a-fA-F:]+.*\\]):([0-9]+)");
HostAndPort ret;
Expand Down
168 changes: 71 additions & 97 deletions lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp
Expand Up @@ -151,26 +151,29 @@ ConnectionFileDescriptor::Connect(llvm::StringRef path,
auto method =
llvm::StringSwitch<ConnectionStatus (ConnectionFileDescriptor::*)(
llvm::StringRef, socket_id_callback_type, Status *)>(scheme)
.Case("listen", &ConnectionFileDescriptor::SocketListenAndAccept)
.Case("listen", &ConnectionFileDescriptor::AcceptTCP)
.Cases("accept", "unix-accept",
&ConnectionFileDescriptor::NamedSocketAccept)
&ConnectionFileDescriptor::AcceptNamedSocket)
.Case("unix-abstract-accept",
&ConnectionFileDescriptor::UnixAbstractSocketAccept)
&ConnectionFileDescriptor::AcceptAbstractSocket)
.Cases("connect", "tcp-connect",
&ConnectionFileDescriptor::ConnectTCP)
.Case("udp", &ConnectionFileDescriptor::ConnectUDP)
.Case("unix-connect", &ConnectionFileDescriptor::NamedSocketConnect)
.Case("unix-connect", &ConnectionFileDescriptor::ConnectNamedSocket)
.Case("unix-abstract-connect",
&ConnectionFileDescriptor::UnixAbstractSocketConnect)
&ConnectionFileDescriptor::ConnectAbstractSocket)
#if LLDB_ENABLE_POSIX
.Case("fd", &ConnectionFileDescriptor::ConnectFD)
.Case("file", &ConnectionFileDescriptor::ConnectFile)
.Case("serial", &ConnectionFileDescriptor::ConnectSerialPort)
#endif
.Default(nullptr);

if (method)
if (method) {
if (error_ptr)
*error_ptr = Status();
return (this->*method)(path, socket_id_callback, error_ptr);
}
}

if (error_ptr)
Expand Down Expand Up @@ -532,24 +535,25 @@ ConnectionFileDescriptor::BytesAvailable(const Timeout<std::micro> &timeout,
return eConnectionStatusLostConnection;
}

ConnectionStatus ConnectionFileDescriptor::NamedSocketAccept(
llvm::StringRef socket_name, socket_id_callback_type socket_id_callback,
lldb::ConnectionStatus ConnectionFileDescriptor::AcceptSocket(
Socket::SocketProtocol socket_protocol, llvm::StringRef socket_name,
llvm::function_ref<void(Socket &)> post_listen_callback,
Status *error_ptr) {
Status error;
std::unique_ptr<Socket> listen_socket = Socket::Create(
Socket::ProtocolUnixDomain, m_child_processes_inherit, error);
Socket *socket = nullptr;
std::unique_ptr<Socket> listening_socket =
Socket::Create(socket_protocol, m_child_processes_inherit, error);
Socket *accepted_socket;

if (!error.Fail())
error = listen_socket->Listen(socket_name, 5);
error = listening_socket->Listen(socket_name, 5);

if (!error.Fail()) {
socket_id_callback(socket_name);
error = listen_socket->Accept(socket);
post_listen_callback(*listening_socket);
error = listening_socket->Accept(accepted_socket);
}

if (!error.Fail()) {
m_io_sp.reset(socket);
m_io_sp.reset(accepted_socket);
m_uri.assign(socket_name.str());
return eConnectionStatusSuccess;
}
Expand All @@ -559,40 +563,19 @@ ConnectionStatus ConnectionFileDescriptor::NamedSocketAccept(
return eConnectionStatusError;
}

ConnectionStatus ConnectionFileDescriptor::NamedSocketConnect(
llvm::StringRef socket_name, socket_id_callback_type socket_id_callback,
Status *error_ptr) {
Socket *socket = nullptr;
Status error =
Socket::UnixDomainConnect(socket_name, m_child_processes_inherit, socket);
if (error_ptr)
*error_ptr = error;
m_io_sp.reset(socket);
if (error.Fail())
return eConnectionStatusError;
m_uri.assign(std::string(socket_name));
return eConnectionStatusSuccess;
}

ConnectionStatus ConnectionFileDescriptor::UnixAbstractSocketAccept(
llvm::StringRef socket_name, socket_id_callback_type socket_id_callback,
Status *error_ptr) {
lldb::ConnectionStatus
ConnectionFileDescriptor::ConnectSocket(Socket::SocketProtocol socket_protocol,
llvm::StringRef socket_name,
Status *error_ptr) {
Status error;
std::unique_ptr<Socket> listen_socket = Socket::Create(
Socket::ProtocolUnixAbstract, m_child_processes_inherit, error);
Socket *socket = nullptr;
std::unique_ptr<Socket> socket =
Socket::Create(socket_protocol, m_child_processes_inherit, error);

if (!error.Fail())
error = listen_socket->Listen(socket_name, 5);

if (!error.Fail())
socket_id_callback(socket_name);

if (!error.Fail())
error = listen_socket->Accept(socket);
error = socket->Connect(socket_name);

if (!error.Fail()) {
m_io_sp.reset(socket);
m_io_sp = std::move(socket);
m_uri.assign(socket_name.str());
return eConnectionStatusSuccess;
}
Expand All @@ -602,72 +585,63 @@ ConnectionStatus ConnectionFileDescriptor::UnixAbstractSocketAccept(
return eConnectionStatusError;
}

lldb::ConnectionStatus ConnectionFileDescriptor::UnixAbstractSocketConnect(
ConnectionStatus ConnectionFileDescriptor::AcceptNamedSocket(
llvm::StringRef socket_name, socket_id_callback_type socket_id_callback,
Status *error_ptr) {
Socket *socket = nullptr;
Status error = Socket::UnixAbstractConnect(socket_name,
m_child_processes_inherit, socket);
if (error_ptr)
*error_ptr = error;
m_io_sp.reset(socket);
if (error.Fail())
return eConnectionStatusError;
m_uri.assign(std::string(socket_name));
return eConnectionStatusSuccess;
return AcceptSocket(
Socket::ProtocolUnixDomain, socket_name,
[socket_id_callback, socket_name](Socket &listening_socket) {
socket_id_callback(socket_name);
},
error_ptr);
}

ConnectionStatus ConnectionFileDescriptor::SocketListenAndAccept(
llvm::StringRef s, socket_id_callback_type socket_id_callback,
ConnectionStatus ConnectionFileDescriptor::ConnectNamedSocket(
llvm::StringRef socket_name, socket_id_callback_type socket_id_callback,
Status *error_ptr) {
if (error_ptr)
*error_ptr = Status();

llvm::Expected<std::unique_ptr<TCPSocket>> listening_socket =
Socket::TcpListen(s, m_child_processes_inherit);
if (!listening_socket) {
if (error_ptr)
*error_ptr = listening_socket.takeError();
else
LLDB_LOG_ERROR(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_CONNECTION),
listening_socket.takeError(), "tcp listen failed: {0}");
return eConnectionStatusError;
}
return ConnectSocket(Socket::ProtocolUnixDomain, socket_name, error_ptr);
}

uint16_t port = listening_socket.get()->GetLocalPortNumber();
socket_id_callback(std::to_string(port));
ConnectionStatus ConnectionFileDescriptor::AcceptAbstractSocket(
llvm::StringRef socket_name, socket_id_callback_type socket_id_callback,
Status *error_ptr) {
return AcceptSocket(
Socket::ProtocolUnixAbstract, socket_name,
[socket_id_callback, socket_name](Socket &listening_socket) {
socket_id_callback(socket_name);
},
error_ptr);
}

Socket *accepted_socket;
Status error = listening_socket.get()->Accept(accepted_socket);
if (error_ptr)
*error_ptr = error;
if (error.Fail())
return eConnectionStatusError;
lldb::ConnectionStatus ConnectionFileDescriptor::ConnectAbstractSocket(
llvm::StringRef socket_name, socket_id_callback_type socket_id_callback,
Status *error_ptr) {
return ConnectSocket(Socket::ProtocolUnixAbstract, socket_name, error_ptr);
}

InitializeSocket(accepted_socket);
return eConnectionStatusSuccess;
ConnectionStatus
ConnectionFileDescriptor::AcceptTCP(llvm::StringRef socket_name,
socket_id_callback_type socket_id_callback,
Status *error_ptr) {
ConnectionStatus ret = AcceptSocket(
Socket::ProtocolTcp, socket_name,
[socket_id_callback](Socket &listening_socket) {
uint16_t port =
static_cast<TCPSocket &>(listening_socket).GetLocalPortNumber();
socket_id_callback(std::to_string(port));
},
error_ptr);
if (ret == eConnectionStatusSuccess)
m_uri.assign(
static_cast<TCPSocket *>(m_io_sp.get())->GetRemoteConnectionURI());
return ret;
}

ConnectionStatus
ConnectionFileDescriptor::ConnectTCP(llvm::StringRef s,
ConnectionFileDescriptor::ConnectTCP(llvm::StringRef socket_name,
socket_id_callback_type socket_id_callback,
Status *error_ptr) {
if (error_ptr)
*error_ptr = Status();

llvm::Expected<std::unique_ptr<Socket>> socket =
Socket::TcpConnect(s, m_child_processes_inherit);
if (!socket) {
if (error_ptr)
*error_ptr = socket.takeError();
else
LLDB_LOG_ERROR(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_CONNECTION),
socket.takeError(), "tcp connect failed: {0}");
return eConnectionStatusError;
}
m_io_sp = std::move(*socket);
m_uri.assign(std::string(s));
return eConnectionStatusSuccess;
return ConnectSocket(Socket::ProtocolTcp, socket_name, error_ptr);
}

ConnectionStatus
Expand Down

0 comments on commit e50f02b

Please sign in to comment.