Loading adb/daemon/jdwp_service.cpp +39 −69 Original line number Diff line number Diff line Loading @@ -212,6 +212,7 @@ static size_t jdwp_process_list_msg(char* buffer, size_t bufferlen) { static void jdwp_process_event(int socket, unsigned events, void* _proc) { JdwpProcess* proc = reinterpret_cast<JdwpProcess*>(_proc); CHECK_EQ(socket, proc->socket); if (events & FDE_READ) { if (proc->pid < 0) { Loading @@ -225,36 +226,16 @@ static void jdwp_process_event(int socket, unsigned events, void* _proc) { D("Adding pid %d to jdwp process list", proc->pid); jdwp_process_list_updated(); } else { /* the pid was read, if we get there it's probably because the connection * was closed (e.g. the JDWP process exited or crashed) */ char buf[32]; while (true) { int len = TEMP_FAILURE_RETRY(recv(socket, buf, sizeof(buf), 0)); if (len == 0) { D("terminating JDWP %d connection: EOF", proc->pid); break; } else if (len < 0) { if (len < 0 && errno == EAGAIN) { return; } D("terminating JDWP %d connection: EOF", proc->pid); break; } else { D("ignoring unexpected JDWP %d control socket activity (%d bytes)", proc->pid, len); } } // We already have the PID, if we can read from the socket, we've probably hit EOF. D("terminating JDWP connection %d", proc->pid); goto CloseProcess; } } if (events & FDE_WRITE) { D("trying to send fd to JDWP process (count = %zu)", proc->out_fds.size()); if (!proc->out_fds.empty()) { CHECK(!proc->out_fds.empty()); int fd = proc->out_fds.back().get(); struct cmsghdr* cmsg; struct msghdr msg; Loading @@ -278,12 +259,7 @@ static void jdwp_process_event(int socket, unsigned events, void* _proc) { cmsg->cmsg_type = SCM_RIGHTS; ((int*)CMSG_DATA(cmsg))[0] = fd; if (!set_file_block_mode(proc->socket, true)) { VLOG(JDWP) << "failed to set blocking mode for fd " << proc->socket; goto CloseProcess; } int ret = TEMP_FAILURE_RETRY(sendmsg(proc->socket, &msg, 0)); int ret = TEMP_FAILURE_RETRY(sendmsg(socket, &msg, 0)); if (ret < 0) { D("sending new file descriptor to JDWP %d failed: %s", proc->pid, strerror(errno)); goto CloseProcess; Loading @@ -292,17 +268,10 @@ static void jdwp_process_event(int socket, unsigned events, void* _proc) { D("sent file descriptor %d to JDWP process %d", fd, proc->pid); proc->out_fds.pop_back(); if (!set_file_block_mode(proc->socket, false)) { VLOG(JDWP) << "failed to set non-blocking mode for fd " << proc->socket; goto CloseProcess; } if (proc->out_fds.empty()) { fdevent_del(proc->fde, FDE_WRITE); } } } return; Loading Loading @@ -406,9 +375,10 @@ static int jdwp_control_init(JdwpControl* control, const char* sockname, int soc return 0; } static void jdwp_control_event(int s, unsigned events, void* _control) { static void jdwp_control_event(int fd, unsigned events, void* _control) { JdwpControl* control = (JdwpControl*)_control; CHECK_EQ(fd, control->listen_socket); if (events & FDE_READ) { int s = adb_socket_accept(control->listen_socket, nullptr, nullptr); if (s < 0) { Loading Loading
adb/daemon/jdwp_service.cpp +39 −69 Original line number Diff line number Diff line Loading @@ -212,6 +212,7 @@ static size_t jdwp_process_list_msg(char* buffer, size_t bufferlen) { static void jdwp_process_event(int socket, unsigned events, void* _proc) { JdwpProcess* proc = reinterpret_cast<JdwpProcess*>(_proc); CHECK_EQ(socket, proc->socket); if (events & FDE_READ) { if (proc->pid < 0) { Loading @@ -225,36 +226,16 @@ static void jdwp_process_event(int socket, unsigned events, void* _proc) { D("Adding pid %d to jdwp process list", proc->pid); jdwp_process_list_updated(); } else { /* the pid was read, if we get there it's probably because the connection * was closed (e.g. the JDWP process exited or crashed) */ char buf[32]; while (true) { int len = TEMP_FAILURE_RETRY(recv(socket, buf, sizeof(buf), 0)); if (len == 0) { D("terminating JDWP %d connection: EOF", proc->pid); break; } else if (len < 0) { if (len < 0 && errno == EAGAIN) { return; } D("terminating JDWP %d connection: EOF", proc->pid); break; } else { D("ignoring unexpected JDWP %d control socket activity (%d bytes)", proc->pid, len); } } // We already have the PID, if we can read from the socket, we've probably hit EOF. D("terminating JDWP connection %d", proc->pid); goto CloseProcess; } } if (events & FDE_WRITE) { D("trying to send fd to JDWP process (count = %zu)", proc->out_fds.size()); if (!proc->out_fds.empty()) { CHECK(!proc->out_fds.empty()); int fd = proc->out_fds.back().get(); struct cmsghdr* cmsg; struct msghdr msg; Loading @@ -278,12 +259,7 @@ static void jdwp_process_event(int socket, unsigned events, void* _proc) { cmsg->cmsg_type = SCM_RIGHTS; ((int*)CMSG_DATA(cmsg))[0] = fd; if (!set_file_block_mode(proc->socket, true)) { VLOG(JDWP) << "failed to set blocking mode for fd " << proc->socket; goto CloseProcess; } int ret = TEMP_FAILURE_RETRY(sendmsg(proc->socket, &msg, 0)); int ret = TEMP_FAILURE_RETRY(sendmsg(socket, &msg, 0)); if (ret < 0) { D("sending new file descriptor to JDWP %d failed: %s", proc->pid, strerror(errno)); goto CloseProcess; Loading @@ -292,17 +268,10 @@ static void jdwp_process_event(int socket, unsigned events, void* _proc) { D("sent file descriptor %d to JDWP process %d", fd, proc->pid); proc->out_fds.pop_back(); if (!set_file_block_mode(proc->socket, false)) { VLOG(JDWP) << "failed to set non-blocking mode for fd " << proc->socket; goto CloseProcess; } if (proc->out_fds.empty()) { fdevent_del(proc->fde, FDE_WRITE); } } } return; Loading Loading @@ -406,9 +375,10 @@ static int jdwp_control_init(JdwpControl* control, const char* sockname, int soc return 0; } static void jdwp_control_event(int s, unsigned events, void* _control) { static void jdwp_control_event(int fd, unsigned events, void* _control) { JdwpControl* control = (JdwpControl*)_control; CHECK_EQ(fd, control->listen_socket); if (events & FDE_READ) { int s = adb_socket_accept(control->listen_socket, nullptr, nullptr); if (s < 0) { Loading