| Index: ipc/mojo/ipc_channel_mojo.cc
|
| diff --git a/ipc/mojo/ipc_channel_mojo.cc b/ipc/mojo/ipc_channel_mojo.cc
|
| index a0f3a9d3ce6b7b71d8dd7e83c32a2c5880b2adf6..45b4d4a188865d86b5625fcb3d448e1ff43a57d0 100644
|
| --- a/ipc/mojo/ipc_channel_mojo.cc
|
| +++ b/ipc/mojo/ipc_channel_mojo.cc
|
| @@ -6,6 +6,7 @@
|
|
|
| #include "base/bind.h"
|
| #include "base/bind_helpers.h"
|
| +#include "base/command_line.h"
|
| #include "base/lazy_instance.h"
|
| #include "base/thread_task_runner_handle.h"
|
| #include "ipc/ipc_listener.h"
|
| @@ -15,6 +16,7 @@
|
| #include "ipc/mojo/client_channel.mojom.h"
|
| #include "ipc/mojo/ipc_mojo_bootstrap.h"
|
| #include "ipc/mojo/ipc_mojo_handle_attachment.h"
|
| +#include "mojo/edk/embedder/embedder.h"
|
| #include "third_party/mojo/src/mojo/edk/embedder/embedder.h"
|
| #include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h"
|
|
|
| @@ -26,6 +28,10 @@ namespace IPC {
|
|
|
| namespace {
|
|
|
| +// TODO(jam): do more tests on using channel on same thread if it supports it (
|
| +// i.e. with use-new-edk and Windows). Also see message_pipe_dispatcher.cc
|
| +bool g_use_channel_on_io = true;
|
| +
|
| class MojoChannelFactory : public ChannelFactory {
|
| public:
|
| MojoChannelFactory(scoped_refptr<base::TaskRunner> io_runner,
|
| @@ -49,24 +55,52 @@ class MojoChannelFactory : public ChannelFactory {
|
|
|
| //------------------------------------------------------------------------------
|
|
|
| -class ClientChannelMojo : public ChannelMojo, public ClientChannel {
|
| +class ClientChannelMojo
|
| + : public ChannelMojo, public ClientChannel {
|
| public:
|
| ClientChannelMojo(scoped_refptr<base::TaskRunner> io_runner,
|
| const ChannelHandle& handle,
|
| - Listener* listener);
|
| - ~ClientChannelMojo() override;
|
| + Listener* listener)
|
| + : ChannelMojo(io_runner, handle, Channel::MODE_CLIENT, listener),
|
| + binding_(this),
|
| + weak_factory_(this) {
|
| + }
|
| + ~ClientChannelMojo() override {}
|
| +
|
| // MojoBootstrap::Delegate implementation
|
| - void OnPipeAvailable(mojo::embedder::ScopedPlatformHandle handle) override;
|
| + void OnPipeAvailable(mojo::embedder::ScopedPlatformHandle handle,
|
| + int32 peer_pid) override {
|
| + if (base::CommandLine::ForCurrentProcess()->HasSwitch("use-new-edk")) {
|
| + mojo::edk::ScopedPlatformHandle edk_handle(mojo::edk::PlatformHandle(
|
| +#if defined(OS_WIN)
|
| + handle.release().handle));
|
| +#else
|
| + handle.release().fd));
|
| +#endif
|
| + InitMessageReader(
|
| + mojo::edk::CreateMessagePipe(edk_handle.Pass()), peer_pid);
|
| + return;
|
| + }
|
| + CreateMessagingPipe(handle.Pass(), base::Bind(&ClientChannelMojo::BindPipe,
|
| + weak_factory_.GetWeakPtr()));
|
| + }
|
|
|
| // ClientChannel implementation
|
| void Init(
|
| mojo::ScopedMessagePipeHandle pipe,
|
| int32_t peer_pid,
|
| - const mojo::Callback<void(int32_t)>& callback) override;
|
| + const mojo::Callback<void(int32_t)>& callback) override {
|
| + InitMessageReader(pipe.Pass(), static_cast<base::ProcessId>(peer_pid));
|
| + callback.Run(GetSelfPID());
|
| + }
|
|
|
| private:
|
| - void BindPipe(mojo::ScopedMessagePipeHandle handle);
|
| - void OnConnectionError();
|
| + void BindPipe(mojo::ScopedMessagePipeHandle handle) {
|
| + binding_.Bind(handle.Pass());
|
| + }
|
| + void OnConnectionError() {
|
| + listener()->OnChannelError();
|
| + }
|
|
|
| mojo::Binding<ClientChannel> binding_;
|
| base::WeakPtrFactory<ClientChannelMojo> weak_factory_;
|
| @@ -74,59 +108,81 @@ class ClientChannelMojo : public ChannelMojo, public ClientChannel {
|
| DISALLOW_COPY_AND_ASSIGN(ClientChannelMojo);
|
| };
|
|
|
| -ClientChannelMojo::ClientChannelMojo(scoped_refptr<base::TaskRunner> io_runner,
|
| - const ChannelHandle& handle,
|
| - Listener* listener)
|
| - : ChannelMojo(io_runner, handle, Channel::MODE_CLIENT, listener),
|
| - binding_(this),
|
| - weak_factory_(this) {}
|
| -
|
| -ClientChannelMojo::~ClientChannelMojo() {
|
| -}
|
| -
|
| -void ClientChannelMojo::OnPipeAvailable(
|
| - mojo::embedder::ScopedPlatformHandle handle) {
|
| - CreateMessagingPipe(handle.Pass(), base::Bind(&ClientChannelMojo::BindPipe,
|
| - weak_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void ClientChannelMojo::Init(
|
| - mojo::ScopedMessagePipeHandle pipe,
|
| - int32_t peer_pid,
|
| - const mojo::Callback<void(int32_t)>& callback) {
|
| - InitMessageReader(pipe.Pass(), static_cast<base::ProcessId>(peer_pid));
|
| - callback.Run(GetSelfPID());
|
| -}
|
| -
|
| -void ClientChannelMojo::BindPipe(mojo::ScopedMessagePipeHandle handle) {
|
| - binding_.Bind(handle.Pass());
|
| -}
|
| -
|
| -void ClientChannelMojo::OnConnectionError() {
|
| - listener()->OnChannelError();
|
| -}
|
| -
|
| //------------------------------------------------------------------------------
|
|
|
| class ServerChannelMojo : public ChannelMojo {
|
| public:
|
| ServerChannelMojo(scoped_refptr<base::TaskRunner> io_runner,
|
| const ChannelHandle& handle,
|
| - Listener* listener);
|
| - ~ServerChannelMojo() override;
|
| + Listener* listener)
|
| + : ChannelMojo(io_runner, handle, Channel::MODE_SERVER, listener),
|
| + weak_factory_(this) {
|
| + }
|
| + ~ServerChannelMojo() override {
|
| + Close();
|
| + }
|
|
|
| // MojoBootstrap::Delegate implementation
|
| - void OnPipeAvailable(mojo::embedder::ScopedPlatformHandle handle) override;
|
| + void OnPipeAvailable(mojo::embedder::ScopedPlatformHandle handle,
|
| + int32 peer_pid) override {
|
| + if (base::CommandLine::ForCurrentProcess()->HasSwitch("use-new-edk")) {
|
| + mojo::edk::ScopedPlatformHandle edk_handle(mojo::edk::PlatformHandle(
|
| +#if defined(OS_WIN)
|
| + handle.release().handle));
|
| +#else
|
| + handle.release().fd));
|
| +#endif
|
| + message_pipe_ = mojo::edk::CreateMessagePipe(edk_handle.Pass());
|
| + if (!message_pipe_.is_valid()) {
|
| + LOG(WARNING) << "mojo::CreateMessagePipe failed: ";
|
| + listener()->OnChannelError();
|
| + return;
|
| + }
|
| + InitMessageReader(message_pipe_.Pass(), peer_pid);
|
| + return;
|
| + }
|
| +
|
| + mojo::ScopedMessagePipeHandle peer;
|
| + MojoResult create_result =
|
| + mojo::CreateMessagePipe(nullptr, &message_pipe_, &peer);
|
| + if (create_result != MOJO_RESULT_OK) {
|
| + LOG(WARNING) << "mojo::CreateMessagePipe failed: " << create_result;
|
| + listener()->OnChannelError();
|
| + return;
|
| + }
|
| + CreateMessagingPipe(
|
| + handle.Pass(),
|
| + base::Bind(&ServerChannelMojo::InitClientChannel,
|
| + weak_factory_.GetWeakPtr(), base::Passed(&peer)));
|
| + }
|
| // Channel override
|
| - void Close() override;
|
| + void Close() override {
|
| + client_channel_.reset();
|
| + message_pipe_.reset();
|
| + ChannelMojo::Close();
|
| + }
|
|
|
| private:
|
| void InitClientChannel(mojo::ScopedMessagePipeHandle peer_handle,
|
| - mojo::ScopedMessagePipeHandle handle);
|
| - void OnConnectionError();
|
| + mojo::ScopedMessagePipeHandle handle) {
|
| + client_channel_.Bind(
|
| + mojo::InterfacePtrInfo<ClientChannel>(handle.Pass(), 0u));
|
| + client_channel_.set_connection_error_handler(base::Bind(
|
| + &ServerChannelMojo::OnConnectionError, base::Unretained(this)));
|
| + client_channel_->Init(
|
| + peer_handle.Pass(), static_cast<int32_t>(GetSelfPID()),
|
| + base::Bind(&ServerChannelMojo::ClientChannelWasInitialized,
|
| + base::Unretained(this)));
|
| + }
|
| +
|
| + void OnConnectionError() {
|
| + listener()->OnChannelError();
|
| + }
|
|
|
| // ClientChannelClient implementation
|
| - void ClientChannelWasInitialized(int32_t peer_pid);
|
| + void ClientChannelWasInitialized(int32_t peer_pid) {
|
| + InitMessageReader(message_pipe_.Pass(), peer_pid);
|
| + }
|
|
|
| mojo::InterfacePtr<ClientChannel> client_channel_;
|
| mojo::ScopedMessagePipeHandle message_pipe_;
|
| @@ -135,59 +191,6 @@ class ServerChannelMojo : public ChannelMojo {
|
| DISALLOW_COPY_AND_ASSIGN(ServerChannelMojo);
|
| };
|
|
|
| -ServerChannelMojo::ServerChannelMojo(scoped_refptr<base::TaskRunner> io_runner,
|
| - const ChannelHandle& handle,
|
| - Listener* listener)
|
| - : ChannelMojo(io_runner, handle, Channel::MODE_SERVER, listener),
|
| - weak_factory_(this) {}
|
| -
|
| -ServerChannelMojo::~ServerChannelMojo() {
|
| - Close();
|
| -}
|
| -
|
| -void ServerChannelMojo::OnPipeAvailable(
|
| - mojo::embedder::ScopedPlatformHandle handle) {
|
| - mojo::ScopedMessagePipeHandle peer;
|
| - MojoResult create_result =
|
| - mojo::CreateMessagePipe(nullptr, &message_pipe_, &peer);
|
| - if (create_result != MOJO_RESULT_OK) {
|
| - LOG(WARNING) << "mojo::CreateMessagePipe failed: " << create_result;
|
| - listener()->OnChannelError();
|
| - return;
|
| - }
|
| - CreateMessagingPipe(
|
| - handle.Pass(),
|
| - base::Bind(&ServerChannelMojo::InitClientChannel,
|
| - weak_factory_.GetWeakPtr(), base::Passed(&peer)));
|
| -}
|
| -
|
| -void ServerChannelMojo::Close() {
|
| - client_channel_.reset();
|
| - message_pipe_.reset();
|
| - ChannelMojo::Close();
|
| -}
|
| -
|
| -void ServerChannelMojo::InitClientChannel(
|
| - mojo::ScopedMessagePipeHandle peer_handle,
|
| - mojo::ScopedMessagePipeHandle handle) {
|
| - client_channel_.Bind(
|
| - mojo::InterfacePtrInfo<ClientChannel>(handle.Pass(), 0u));
|
| - client_channel_.set_connection_error_handler(base::Bind(
|
| - &ServerChannelMojo::OnConnectionError, base::Unretained(this)));
|
| - client_channel_->Init(
|
| - peer_handle.Pass(), static_cast<int32_t>(GetSelfPID()),
|
| - base::Bind(&ServerChannelMojo::ClientChannelWasInitialized,
|
| - base::Unretained(this)));
|
| -}
|
| -
|
| -void ServerChannelMojo::OnConnectionError() {
|
| - listener()->OnChannelError();
|
| -}
|
| -
|
| -void ServerChannelMojo::ClientChannelWasInitialized(int32_t peer_pid) {
|
| - InitMessageReader(message_pipe_.Pass(), peer_pid);
|
| -}
|
| -
|
| #if defined(OS_POSIX) && !defined(OS_NACL)
|
|
|
| base::ScopedFD TakeOrDupFile(internal::PlatformFileAttachment* attachment) {
|
| @@ -276,7 +279,8 @@ ChannelMojo::ChannelMojo(scoped_refptr<base::TaskRunner> io_runner,
|
| // Create MojoBootstrap after all members are set as it touches
|
| // ChannelMojo from a different thread.
|
| bootstrap_ = MojoBootstrap::Create(handle, mode, this);
|
| - if (io_runner == base::MessageLoop::current()->task_runner()) {
|
| + if (g_use_channel_on_io ||
|
| + io_runner == base::MessageLoop::current()->task_runner()) {
|
| InitOnIOThread();
|
| } else {
|
| io_runner->PostTask(FROM_HERE, base::Bind(&ChannelMojo::InitOnIOThread,
|
| @@ -298,7 +302,8 @@ void ChannelMojo::CreateMessagingPipe(
|
| const CreateMessagingPipeCallback& callback) {
|
| auto return_callback = base::Bind(&ChannelMojo::OnMessagingPipeCreated,
|
| weak_factory_.GetWeakPtr(), callback);
|
| - if (base::ThreadTaskRunnerHandle::Get() == io_runner_) {
|
| + if (g_use_channel_on_io ||
|
| + base::ThreadTaskRunnerHandle::Get() == io_runner_) {
|
| CreateMessagingPipeOnIOThread(
|
| handle.Pass(), base::ThreadTaskRunnerHandle::Get(), return_callback);
|
| } else {
|
| @@ -487,7 +492,7 @@ MojoResult ChannelMojo::ReadFromMessageAttachmentSet(
|
| }
|
|
|
| MojoHandle wrapped_handle;
|
| - MojoResult wrap_result = CreatePlatformHandleWrapper(
|
| + MojoResult wrap_result = mojo::embedder::CreatePlatformHandleWrapper(
|
| mojo::embedder::ScopedPlatformHandle(
|
| mojo::embedder::PlatformHandle(file.release())),
|
| &wrapped_handle);
|
|
|