From 15dcc62c720be795acaeb647c65632af466729a5 Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Fri, 5 Oct 2018 17:09:41 -0700 Subject: [PATCH] adbd: clean up jdwp service a bit. Change-Id: Ia42447576b047dfa9ddc0b73b87adc8114e3f20f Test: ./test_device.py --- adb/daemon/jdwp_service.cpp | 100 +++++++++++++----------------------- 1 file changed, 35 insertions(+), 65 deletions(-) diff --git a/adb/daemon/jdwp_service.cpp b/adb/daemon/jdwp_service.cpp index b40faee6f..fe79acd97 100644 --- a/adb/daemon/jdwp_service.cpp +++ b/adb/daemon/jdwp_service.cpp @@ -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(_proc); + CHECK_EQ(socket, proc->socket); if (events & FDE_READ) { if (proc->pid < 0) { @@ -225,82 +226,50 @@ 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()) { - int fd = proc->out_fds.back().get(); - struct cmsghdr* cmsg; - struct msghdr msg; - struct iovec iov; - char dummy = '!'; - char buffer[sizeof(struct cmsghdr) + sizeof(int)]; + CHECK(!proc->out_fds.empty()); - iov.iov_base = &dummy; - iov.iov_len = 1; - msg.msg_name = nullptr; - msg.msg_namelen = 0; - msg.msg_iov = &iov; - msg.msg_iovlen = 1; - msg.msg_flags = 0; - msg.msg_control = buffer; - msg.msg_controllen = sizeof(buffer); + int fd = proc->out_fds.back().get(); + struct cmsghdr* cmsg; + struct msghdr msg; + struct iovec iov; + char dummy = '!'; + char buffer[sizeof(struct cmsghdr) + sizeof(int)]; - cmsg = CMSG_FIRSTHDR(&msg); - cmsg->cmsg_len = msg.msg_controllen; - cmsg->cmsg_level = SOL_SOCKET; - cmsg->cmsg_type = SCM_RIGHTS; - ((int*)CMSG_DATA(cmsg))[0] = fd; + iov.iov_base = &dummy; + iov.iov_len = 1; + msg.msg_name = nullptr; + msg.msg_namelen = 0; + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + msg.msg_flags = 0; + msg.msg_control = buffer; + msg.msg_controllen = sizeof(buffer); - if (!set_file_block_mode(proc->socket, true)) { - VLOG(JDWP) << "failed to set blocking mode for fd " << proc->socket; - goto CloseProcess; - } + cmsg = CMSG_FIRSTHDR(&msg); + cmsg->cmsg_len = msg.msg_controllen; + cmsg->cmsg_level = SOL_SOCKET; + cmsg->cmsg_type = SCM_RIGHTS; + ((int*)CMSG_DATA(cmsg))[0] = fd; - int ret = TEMP_FAILURE_RETRY(sendmsg(proc->socket, &msg, 0)); - if (ret < 0) { - D("sending new file descriptor to JDWP %d failed: %s", proc->pid, strerror(errno)); - goto CloseProcess; - } + 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; + } - D("sent file descriptor %d to JDWP process %d", fd, proc->pid); + 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); - } + proc->out_fds.pop_back(); + if (proc->out_fds.empty()) { + fdevent_del(proc->fde, FDE_WRITE); } } @@ -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) {