19 : socket_handle_(socket_handle) {}
23 SocketHandle socket_handle = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
28 struct sockaddr_in sockaddr;
30 memset(&sockaddr, 0,
sizeof(sockaddr));
31 socklen_t addrlen =
static_cast<socklen_t
>(
sizeof(sockaddr));
32 sockaddr.sin_family = AF_INET;
33 sockaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
34 sockaddr.sin_port = htons(tcp_port);
45 int exclusive_address = 1;
46 if (setsockopt(socket_handle, SOL_SOCKET, SO_EXCLUSIVEADDRUSE,
47 reinterpret_cast<char*
>(&exclusive_address),
48 sizeof(exclusive_address))) {
56 int reuse_address = 1;
57 if (setsockopt(socket_handle, SOL_SOCKET, SO_REUSEADDR,
58 reinterpret_cast<char*
>(&reuse_address),
59 sizeof(reuse_address))) {
64 if (bind(socket_handle,
reinterpret_cast<struct sockaddr*
>(&sockaddr),
70 if (listen(socket_handle, 1)) {
82 struct sockaddr_in saddr;
83 struct sockaddr* psaddr =
reinterpret_cast<struct sockaddr*
>(&saddr);
85 memset(&saddr, 0,
sizeof(saddr));
86 socklen_t addrlen =
static_cast<socklen_t
>(
sizeof(saddr));
91 return ntohs(saddr.sin_port);
99 if (::setsockopt(socket, IPPROTO_TCP, TCP_NODELAY,
100 reinterpret_cast<char*
>(&nodelay),
sizeof(nodelay))) {
106 :
buf_(new char[kBufSize]),
119 int32_t copy_bytes = std::min(*len,
size_ -
pos_);
120 memcpy(*dst,
buf_.get() +
pos_, copy_bytes);
170 struct timeval timeout;
175 int cnt = select(
static_cast<int>(
handle_accept_) + 1, &fds, 0, 0, &timeout);
179 if (cnt != 0)
return true;
203 socket_event_ = WSA_INVALID_EVENT;
204 faulted_thread_event_ = ::CreateEvent(NULL, TRUE, FALSE, NULL);
205 if (faulted_thread_event_ == NULL) {
207 "SocketTransport::SocketTransport: Failed to create event object for "
213 if (!CloseHandle(faulted_thread_event_)) {
215 "SocketTransport::~SocketTransport: Failed to close "
220 if (!::WSACloseEvent(socket_event_)) {
222 "SocketTransport::~SocketTransport: Failed to close "
235 socket_event_ = ::WSACreateEvent();
236 if (socket_event_ == WSA_INVALID_EVENT) {
238 "SocketTransport::AcceptConnection: Failed to create socket event\n");
245 if (::WSAEventSelect(
handle_accept_, socket_event_, FD_CLOSE | FD_READ) ==
248 "SocketTransport::AcceptConnection: Failed to bind event to "
272 if (::WaitForSingleObject(socket_event_, INFINITE) == WAIT_FAILED) {
274 "SocketTransport::ReadSomeData: Failed to wait on socket event\n");
276 if (!::ResetEvent(socket_event_)) {
278 "SocketTransport::ReadSomeData: Failed to reset socket event\n");
294 handles[0] = faulted_thread_event_;
295 handles[1] = socket_event_;
298 WaitForMultipleObjects(count, handles, FALSE, wait ? INFINITE : 0);
299 if (
result == WAIT_OBJECT_0 + 1) {
300 if (!ResetEvent(socket_event_)) {
302 "SocketTransport::WaitForDebugStubEvent: Failed to reset socket "
306 }
else if (
result == WAIT_OBJECT_0) {
307 if (!ResetEvent(faulted_thread_event_)) {
309 "SocketTransport::WaitForDebugStubEvent: Failed to reset event\n");
312 }
else if (
result == WAIT_TIMEOUT) {
316 "SocketTransport::WaitForDebugStubEvent: Wait for events failed\n");
320 if (!SetEvent(faulted_thread_event_)) {
329 if (socket_event_ != WSA_INVALID_EVENT && !::WSACloseEvent(socket_event_)) {
331 "SocketTransport::~SocketTransport: Failed to close "
334 socket_event_ = WSA_INVALID_EVENT;
342#if defined(__linux__)
343 int ret = pipe2(fds, O_CLOEXEC);
349 "SocketTransport::SocketTransport: Failed to allocate pipe for faulted "
359 "SocketTransport::~SocketTransport: Failed to close "
364 "SocketTransport::~SocketTransport: Failed to close "
413 ret = select(max_fd + 1, &fds, NULL, NULL, NULL);
415 struct timeval timeout;
418 ret = select(max_fd + 1, &fds, NULL, NULL, &timeout);
422 "SocketTransport::WaitForDebugStubEvent: Failed to wait for "
423 "debug stub event\n");
431 "SocketTransport::WaitForDebugStubEvent: Failed to read from "
432 "debug stub event pipe fd\n");
444 "SocketTransport:SignalThreadEvent: Can't send debug stub "
SocketBinding(SocketHandle socket_handle)
static SocketBinding Bind(uint16_t tcp_port)
std::unique_ptr< SocketTransport > CreateTransport()
SocketHandle socket_handle_
bool ReadSomeData() override
bool AcceptConnection() override
SocketTransport(SocketHandle s)
void WaitForDebugStubEvent() override
bool SignalThreadEvent() override
~SocketTransport() override
int faulted_thread_fd_write_
int faulted_thread_fd_read_
virtual void Disconnect()=0
std::unique_ptr< char[]> buf_
bool Read(char *dst, int32_t len) override
void CopyFromBuffer(char **dst, int32_t *len)
void Disconnect() override
bool Write(const char *src, int32_t len) override
SocketHandle handle_accept_
Transport(SocketHandle s)
virtual bool ReadSomeData()=0
SocketHandle handle_bind_
bool IsDataAvailable() const override
static const int kBufSize
#define TRACE_GDB_REMOTE(...)
ZoneVector< RpoNumber > & result
void DisableNagleAlgorithm(SocketHandle socket)
static const int kErrInterrupt
#define SocketGetLastError()