| Index: content/common/mojo/channel_init.cc
|
| diff --git a/content/common/mojo/channel_init.cc b/content/common/mojo/channel_init.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1599eb11d12dda89890fbc95a70bfab41a69eb96
|
| --- /dev/null
|
| +++ b/content/common/mojo/channel_init.cc
|
| @@ -0,0 +1,80 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "content/common/mojo/channel_init.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/bind_helpers.h"
|
| +#include "base/lazy_instance.h"
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "third_party/mojo/src/mojo/edk/embedder/embedder.h"
|
| +
|
| +namespace content {
|
| +
|
| +namespace {
|
| +
|
| +base::LazyInstance<scoped_refptr<base::TaskRunner>>
|
| + g_single_process_task_runner = LAZY_INSTANCE_INITIALIZER;
|
| +
|
| +} // namespace
|
| +
|
| +ChannelInit::ChannelInit() : channel_info_(nullptr), weak_factory_(this) {}
|
| +
|
| +ChannelInit::~ChannelInit() {
|
| + if (channel_info_)
|
| + mojo::embedder::DestroyChannel(channel_info_,
|
| + base::Bind(&base::DoNothing), nullptr);
|
| +}
|
| +
|
| +mojo::ScopedMessagePipeHandle ChannelInit::Init(
|
| + base::PlatformFile file,
|
| + scoped_refptr<base::TaskRunner> io_thread_task_runner) {
|
| + scoped_ptr<IPC::ScopedIPCSupport> ipc_support(
|
| + new IPC::ScopedIPCSupport(io_thread_task_runner));
|
| + mojo::ScopedMessagePipeHandle message_pipe =
|
| + mojo::embedder::CreateChannel(
|
| + mojo::embedder::ScopedPlatformHandle(
|
| + mojo::embedder::PlatformHandle(file)),
|
| + io_thread_task_runner,
|
| + base::Bind(&ChannelInit::OnCreatedChannel,
|
| + weak_factory_.GetWeakPtr(),
|
| + base::Passed(&ipc_support)),
|
| + base::MessageLoop::current()->task_runner()).Pass();
|
| + return message_pipe.Pass();
|
| +}
|
| +
|
| +void ChannelInit::WillDestroySoon() {
|
| + if (channel_info_)
|
| + mojo::embedder::WillDestroyChannelSoon(channel_info_);
|
| +}
|
| +
|
| +// static
|
| +scoped_refptr<base::TaskRunner> ChannelInit::GetSingleProcessIOTaskRunner() {
|
| + return g_single_process_task_runner.Get();
|
| +}
|
| +
|
| +// static
|
| +void ChannelInit::SetSingleProcessIOTaskRunner(
|
| + scoped_refptr<base::TaskRunner> io_task_runner) {
|
| + g_single_process_task_runner.Get() = io_task_runner;
|
| +}
|
| +
|
| +// static
|
| +void ChannelInit::OnCreatedChannel(
|
| + base::WeakPtr<ChannelInit> self,
|
| + scoped_ptr<IPC::ScopedIPCSupport> ipc_support,
|
| + mojo::embedder::ChannelInfo* channel) {
|
| + // If |self| was already destroyed, shut the channel down.
|
| + if (!self) {
|
| + mojo::embedder::DestroyChannel(channel,
|
| + base::Bind(&base::DoNothing), nullptr);
|
| + return;
|
| + }
|
| +
|
| + DCHECK(!self->channel_info_);
|
| + self->channel_info_ = channel;
|
| + self->ipc_support_ = ipc_support.Pass();
|
| +}
|
| +
|
| +} // namespace content
|
|
|