adbd: clean up jdwp service a bit.

Change-Id: Ia42447576b047dfa9ddc0b73b87adc8114e3f20f
Test: ./test_device.py
This commit is contained in:
Josh Gao 2018-10-05 17:09:41 -07:00
parent 39c1f4bca5
commit 15dcc62c72

View file

@ -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) {
@ -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) {