| Index: mojo/edk/system/child_broker_host.cc
|
| diff --git a/mojo/edk/system/child_broker_host.cc b/mojo/edk/system/child_broker_host.cc
|
| index e321b053e07e0a5a2c5140c4648172373f60b942..b85180087a69ee34a237ef496dffdfe04be00eb1 100644
|
| --- a/mojo/edk/system/child_broker_host.cc
|
| +++ b/mojo/edk/system/child_broker_host.cc
|
| @@ -12,21 +12,12 @@
|
| #include "base/lazy_instance.h"
|
| #include "mojo/edk/embedder/embedder_internal.h"
|
| #include "mojo/edk/embedder/platform_channel_pair.h"
|
| -#include "mojo/edk/embedder/platform_shared_buffer.h"
|
| -#include "mojo/edk/embedder/platform_support.h"
|
| #include "mojo/edk/system/broker_messages.h"
|
| #include "mojo/edk/system/broker_state.h"
|
| #include "mojo/edk/system/configuration.h"
|
| #include "mojo/edk/system/core.h"
|
| #include "mojo/edk/system/platform_handle_dispatcher.h"
|
|
|
| -#if defined(OS_POSIX)
|
| -#include <fcntl.h>
|
| -#include <sys/uio.h>
|
| -
|
| -#include "mojo/edk/embedder/platform_channel_utils_posix.h"
|
| -#endif
|
| -
|
| namespace mojo {
|
| namespace edk {
|
|
|
| @@ -38,33 +29,27 @@ static const int kDefaultReadBufferSize = 256;
|
|
|
| ChildBrokerHost::ChildBrokerHost(base::ProcessHandle child_process,
|
| ScopedPlatformHandle pipe)
|
| - : process_id_(base::GetProcId(child_process)),
|
| - child_channel_(nullptr),
|
| - num_bytes_read_(0) {
|
| - // First set up the synchronous pipe.
|
| - sync_channel_ = std::move(pipe);
|
| -
|
| - // See comment in ChildBroker::SetChildBrokerHostHandle. Summary is we need
|
| - // two pipes, so send the second one over the first one.
|
| - PlatformChannelPair parent_pipe;
|
| -
|
| - ScopedPlatformHandle parent_async_channel_handle =
|
| - parent_pipe.PassServerHandle();
|
| -
|
| - num_bytes_read_ = 0;
|
| -
|
| -// Send over the async pipe.
|
| -#if defined(OS_WIN)
|
| + : process_id_(base::GetProcId(child_process)), child_channel_(nullptr) {
|
| + ScopedPlatformHandle parent_async_channel_handle;
|
| +#if defined(OS_POSIX)
|
| + parent_async_channel_handle = std::move(pipe);
|
| +#else
|
| DuplicateHandle(GetCurrentProcess(), child_process,
|
| GetCurrentProcess(), &child_process,
|
| 0, FALSE, DUPLICATE_SAME_ACCESS);
|
| child_process_ = base::Process(child_process);
|
| -
|
| + sync_channel_ = std::move(pipe);
|
| memset(&read_context_.overlapped, 0, sizeof(read_context_.overlapped));
|
| read_context_.handler = this;
|
| memset(&write_context_.overlapped, 0, sizeof(write_context_.overlapped));
|
| write_context_.handler = this;
|
| read_data_.resize(kDefaultReadBufferSize);
|
| + num_bytes_read_ = 0;
|
| +
|
| + // See comment in ChildBroker::SetChildBrokerHostHandle. Summary is we need
|
| + // two pipes on Windows, so send the second one over the first one.
|
| + PlatformChannelPair parent_pipe;
|
| + parent_async_channel_handle = parent_pipe.PassServerHandle();
|
|
|
| HANDLE duplicated_child_handle =
|
| DuplicateToChild(parent_pipe.PassClientHandle().release().handle);
|
| @@ -72,13 +57,6 @@ ChildBrokerHost::ChildBrokerHost(base::ProcessHandle child_process,
|
| &duplicated_child_handle, sizeof(duplicated_child_handle),
|
| NULL, &write_context_.overlapped);
|
| DCHECK(rv || GetLastError() == ERROR_IO_PENDING);
|
| -#else
|
| - // Send just one null byte.
|
| - struct iovec iov = {const_cast<char*>(""), 1};
|
| - PlatformHandle child_handle = parent_pipe.PassClientHandle().release();
|
| - ssize_t result = PlatformChannelSendmsgWithHandles(sync_channel_.get(), &iov,
|
| - 1, &child_handle, 1);
|
| - CHECK_NE(-1, result);
|
| #endif
|
|
|
| internal::g_io_thread_task_runner->PostTask(
|
| @@ -163,11 +141,6 @@ void ChildBrokerHost::InitOnIO(
|
| base::MessageLoopForIO::current()->RegisterIOHandler(
|
| sync_channel_.get().handle, this);
|
| BeginRead();
|
| -#else
|
| - base::MessageLoopForIO::current()->WatchFileDescriptor(
|
| - sync_channel_.get().handle, true, base::MessageLoopForIO::WATCH_READ,
|
| - &fd_controller_, this);
|
| - TryReadAndWriteHandles();
|
| #endif
|
| }
|
|
|
| @@ -206,8 +179,11 @@ void ChildBrokerHost::OnError(Error error) {
|
| }
|
|
|
| void ChildBrokerHost::ChannelDestructed(RoutedRawChannel* channel) {
|
| - // We have two pipes to the child process. It's easier to wait
|
| + // On Windows, we have two pipes to the child process. It's easier to wait
|
| // until we get the error from the pipe that is used for synchronous I/O.
|
| +#if !defined(OS_WIN)
|
| + delete this;
|
| +#endif
|
| }
|
|
|
| #if defined(OS_WIN)
|
| @@ -249,7 +225,7 @@ void ChildBrokerHost::OnIOCompleted(base::MessageLoopForIO::IOContext* context,
|
|
|
| num_bytes_read_ += bytes_transferred;
|
| CHECK_GE(num_bytes_read_, sizeof(uint32_t));
|
| - BrokerMessage* message = reinterpret_cast<BrokerMessage*>(read_data_.data());
|
| + BrokerMessage* message = reinterpret_cast<BrokerMessage*>(&read_data_[0]);
|
| if (num_bytes_read_ < message->size) {
|
| read_data_.resize(message->size);
|
| BeginRead();
|
| @@ -347,88 +323,6 @@ HANDLE ChildBrokerHost::DuplicateFromChild(HANDLE handle) {
|
| DCHECK(result);
|
| return rv;
|
| }
|
| -#else
|
| -void ChildBrokerHost::TryReadAndWriteHandles() {
|
| - // Message sizes are constant on POSIX currently. Further, the child process
|
| - // only writes one message before it gets a response.
|
| - read_data_.resize(sizeof(BrokerMessage));
|
| -
|
| - std::deque<PlatformHandle> dummy;
|
| - ssize_t bytes_read = PlatformChannelRecvmsg(
|
| - sync_channel_.get(), &read_data_[num_bytes_read_],
|
| - static_cast<int>(read_data_.size() - num_bytes_read_), &dummy);
|
| - DCHECK(dummy.empty());
|
| -
|
| - // We call TryReadAndWriteHandles when we are first initialized so this could
|
| - // fail with EAGAIN or EWOULDBLOCK.
|
| - if (bytes_read == 0 ||
|
| - (bytes_read == -1 && errno != EAGAIN && errno != EWOULDBLOCK)) {
|
| - delete this;
|
| - return;
|
| - }
|
| -
|
| - if (bytes_read == -1)
|
| - return;
|
| -
|
| - num_bytes_read_ += bytes_read;
|
| -
|
| - // We don't know how big the message is yet.
|
| - if (num_bytes_read_ < sizeof(uint32_t))
|
| - return;
|
| -
|
| - BrokerMessage* message = reinterpret_cast<BrokerMessage*>(read_data_.data());
|
| - // Message not fully read yet.
|
| - if (num_bytes_read_ < message->size) {
|
| - DCHECK_LE(message->size, sizeof(BrokerMessage));
|
| - return;
|
| - }
|
| -
|
| - // Should only get one message.
|
| - DCHECK_EQ(num_bytes_read_, message->size);
|
| -
|
| - PlatformHandle handle;
|
| - if (message->id == CREATE_SHARED_BUFFER) {
|
| - scoped_refptr<PlatformSharedBuffer> shared_buffer =
|
| - internal::g_platform_support->CreateSharedBuffer(
|
| - message->shared_buffer_size);
|
| - if (shared_buffer)
|
| - handle = shared_buffer->PassPlatformHandle().release();
|
| - else
|
| - LOG(ERROR) << "ChildBrokerHost failed to create shared buffer of size "
|
| - << message->shared_buffer_size;
|
| - } else {
|
| - NOTREACHED() << "Unknown command. Stopping reading.";
|
| - delete this;
|
| - return;
|
| - }
|
| -
|
| - num_bytes_read_ = 0;
|
| - read_data_.clear();
|
| -
|
| - // Send just one null byte. Also send back a null platform handle if we
|
| - // couldn't create the shared buffer.
|
| - struct iovec iov = {const_cast<char*>(""), 1};
|
| - ssize_t result = PlatformChannelSendmsgWithHandles(sync_channel_.get(), &iov,
|
| - 1, &handle, 1);
|
| - if (result == -1) {
|
| - PLOG(ERROR) << "ChildBrokerHost could not write to peer";
|
| - delete this;
|
| - }
|
| -}
|
| -
|
| -void ChildBrokerHost::OnFileCanReadWithoutBlocking(int fd) {
|
| - DCHECK(internal::g_io_thread_task_runner->RunsTasksOnCurrentThread());
|
| - if (fd != sync_channel_.get().handle) {
|
| - NOTREACHED() << "ChildBrokerHost shouldn't get notifications about file "
|
| - "descriptors other than sync_channel_'s";
|
| - delete this;
|
| - return;
|
| - }
|
| -
|
| - TryReadAndWriteHandles();
|
| -}
|
| -
|
| -void ChildBrokerHost::OnFileCanWriteWithoutBlocking(int fd) {}
|
| #endif
|
|
|
| } // namespace edk
|
|
|