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()