| Index: mojo/edk/system/channel_posix.cc
|
| diff --git a/mojo/edk/system/channel_posix.cc b/mojo/edk/system/channel_posix.cc
|
| index 16a9304462f9c5d4e48d9632174cdc1923663d13..77a5832de4774c1f07fd3073e99eac3229c64ae8 100644
|
| --- a/mojo/edk/system/channel_posix.cc
|
| +++ b/mojo/edk/system/channel_posix.cc
|
| @@ -211,11 +211,19 @@ class ChannelPosix : public Channel,
|
| DCHECK(!read_watcher_);
|
| DCHECK(!write_watcher_);
|
| read_watcher_.reset(new base::MessageLoopForIO::FileDescriptorWatcher);
|
| - write_watcher_.reset(new base::MessageLoopForIO::FileDescriptorWatcher);
|
| - base::MessageLoopForIO::current()->WatchFileDescriptor(
|
| - handle_.get().handle, true /* persistent */,
|
| - base::MessageLoopForIO::WATCH_READ, read_watcher_.get(), this);
|
| base::MessageLoop::current()->AddDestructionObserver(this);
|
| + if (handle_.get().needs_connection) {
|
| + base::MessageLoopForIO::current()->WatchFileDescriptor(
|
| + handle_.get().handle, false /* persistent */,
|
| + base::MessageLoopForIO::WATCH_READ, read_watcher_.get(), this);
|
| + } else {
|
| + write_watcher_.reset(new base::MessageLoopForIO::FileDescriptorWatcher);
|
| + base::MessageLoopForIO::current()->WatchFileDescriptor(
|
| + handle_.get().handle, true /* persistent */,
|
| + base::MessageLoopForIO::WATCH_READ, read_watcher_.get(), this);
|
| + base::AutoLock lock(write_lock_);
|
| + FlushOutgoingMessagesNoLock();
|
| + }
|
| }
|
|
|
| void WaitForWriteOnIOThread() {
|
| @@ -265,6 +273,24 @@ class ChannelPosix : public Channel,
|
| // base::MessageLoopForIO::Watcher:
|
| void OnFileCanReadWithoutBlocking(int fd) override {
|
| CHECK_EQ(fd, handle_.get().handle);
|
| + if (handle_.get().needs_connection) {
|
| +#if !defined(OS_NACL)
|
| + read_watcher_.reset();
|
| + base::MessageLoop::current()->RemoveDestructionObserver(this);
|
| +
|
| + ScopedPlatformHandle accept_fd;
|
| + ServerAcceptConnection(handle_.get(), &accept_fd);
|
| + if (!accept_fd.is_valid()) {
|
| + OnError();
|
| + return;
|
| + }
|
| + handle_ = std::move(accept_fd);
|
| + StartOnIOThread();
|
| +#else
|
| + NOTREACHED();
|
| +#endif
|
| + return;
|
| + }
|
|
|
| bool read_error = false;
|
| size_t next_read_size = 0;
|
| @@ -321,6 +347,10 @@ class ChannelPosix : public Channel,
|
| // cannot be written, it's queued and a wait is initiated to write the message
|
| // ASAP on the I/O thread.
|
| bool WriteNoLock(MessageView message_view) {
|
| + if (handle_.get().needs_connection) {
|
| + outgoing_messages_.emplace_front(std::move(message_view));
|
| + return true;
|
| + }
|
| size_t bytes_written = 0;
|
| do {
|
| message_view.advance_data_offset(bytes_written);
|
|
|