diff options
| author | The Android Open Source Project <initial-contribution@android.com> | 2010-07-20 10:11:20 -0700 |
|---|---|---|
| committer | The Android Open Source Project <initial-contribution@android.com> | 2010-07-20 10:11:20 -0700 |
| commit | 02565fec8240bbff105f285e9e25aade52c15450 (patch) | |
| tree | d2063af442ad61240b09dac49fe570321742c202 | |
| parent | 7fdcc435b67ddc82e4bfb68067b8bb96f34ebf77 (diff) | |
| parent | fdb13f793742bd981f45333f056e4baa5281e4b5 (diff) | |
| download | system_core-02565fec8240bbff105f285e9e25aade52c15450.tar.gz system_core-02565fec8240bbff105f285e9e25aade52c15450.tar.bz2 system_core-02565fec8240bbff105f285e9e25aade52c15450.zip | |
merge from open-source master
Change-Id: Ice679e12b8393621b21a8dafe640dd880a09d35e
| -rw-r--r-- | adb/jdwp_service.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/adb/jdwp_service.c b/adb/jdwp_service.c index 0c26f7b66..296f718f6 100644 --- a/adb/jdwp_service.c +++ b/adb/jdwp_service.c @@ -5,6 +5,7 @@ #include <errno.h> #include <stdio.h> #include <string.h> +#include <unistd.h> /* here's how these things work. @@ -320,6 +321,7 @@ jdwp_process_event( int socket, unsigned events, void* _proc ) struct iovec iov; char dummy = '!'; char buffer[sizeof(struct cmsghdr) + sizeof(int)]; + int flags; iov.iov_base = &dummy; iov.iov_len = 1; @@ -337,10 +339,27 @@ jdwp_process_event( int socket, unsigned events, void* _proc ) cmsg->cmsg_type = SCM_RIGHTS; ((int*)CMSG_DATA(cmsg))[0] = fd; + flags = fcntl(proc->socket,F_GETFL,0); + + if (flags == -1) { + D("failed to get cntl flags for socket %d: %s\n", + proc->pid, strerror(errno)); + goto CloseProcess; + + } + + if (fcntl(proc->socket, F_SETFL, flags & ~O_NONBLOCK) == -1) { + D("failed to remove O_NONBLOCK flag for socket %d: %s\n", + proc->pid, strerror(errno)); + goto CloseProcess; + } + for (;;) { ret = sendmsg(proc->socket, &msg, 0); - if (ret >= 0) + if (ret >= 0) { + adb_close(fd); break; + } if (errno == EINTR) continue; D("sending new file descriptor to JDWP %d failed: %s\n", @@ -354,6 +373,12 @@ jdwp_process_event( int socket, unsigned events, void* _proc ) for (n = 1; n < proc->out_count; n++) proc->out_fds[n-1] = proc->out_fds[n]; + if (fcntl(proc->socket, F_SETFL, flags) == -1) { + D("failed to set O_NONBLOCK flag for socket %d: %s\n", + proc->pid, strerror(errno)); + goto CloseProcess; + } + if (--proc->out_count == 0) fdevent_del( proc->fde, FDE_WRITE ); } |
