| Index: content/common/mojo/mojo_channel_init.cc
|
| diff --git a/content/common/mojo/mojo_channel_init.cc b/content/common/mojo/mojo_channel_init.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..aaace7224981c744f0ee1f4e64d1de3f18f04bb6
|
| --- /dev/null
|
| +++ b/content/common/mojo/mojo_channel_init.cc
|
| @@ -0,0 +1,97 @@
|
| +// Copyright (c) 2014 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/mojo_channel_init.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/lazy_instance.h"
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "base/synchronization/lock.h"
|
| +#include "mojo/system/embedder/embedder.h"
|
| +
|
| +namespace content {
|
| +
|
| +namespace {
|
| +
|
| +struct Initializer {
|
| + Initializer() {
|
| + mojo::embedder::Init();
|
| + }
|
| +};
|
| +
|
| +static base::LazyInstance<Initializer>::Leaky initializer =
|
| + LAZY_INSTANCE_INITIALIZER;
|
| +
|
| +// Initializes mojo. Use a lazy instance to ensure we only do this once.
|
| +// TODO(sky): this likely wants to move to a more central location, such as
|
| +// startup.
|
| +void InitMojo() {
|
| + initializer.Get();
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +MojoChannelInit::MojoChannelInit()
|
| + : main_thread_(base::MessageLoop::current()->message_loop_proxy()),
|
| + channel_info_(NULL),
|
| + weak_factory_(this) {
|
| +}
|
| +
|
| +MojoChannelInit::~MojoChannelInit() {
|
| + bootstrap_message_pipe_.reset();
|
| + if (channel_info_) {
|
| + io_thread_task_runner_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&mojo::embedder::DestroyChannelOnIOThread, channel_info_));
|
| + }
|
| +}
|
| +
|
| +void MojoChannelInit::Init(
|
| + base::PlatformFile file,
|
| + scoped_refptr<base::TaskRunner> io_thread_task_runner) {
|
| + DCHECK(!io_thread_task_runner_.get()); // Should only init once.
|
| + io_thread_task_runner_ = io_thread_task_runner;
|
| + InitMojo();
|
| + bootstrap_message_pipe_.reset(
|
| + mojo::Handle(
|
| + mojo::embedder::CreateChannel(
|
| + mojo::embedder::ScopedPlatformHandle(
|
| + mojo::embedder::PlatformHandle(file)),
|
| + io_thread_task_runner,
|
| + base::Bind(&MojoChannelInit::OnCreatedChannelOnIOThread,
|
| + weak_factory_.GetWeakPtr(),
|
| + main_thread_,
|
| + io_thread_task_runner))));
|
| +}
|
| +
|
| +// static
|
| +void MojoChannelInit::OnCreatedChannelOnIOThread(
|
| + base::WeakPtr<MojoChannelInit> host,
|
| + scoped_refptr<base::TaskRunner> main_thread,
|
| + scoped_refptr<base::TaskRunner> io_thread,
|
| + mojo::embedder::ChannelInfo* channel) {
|
| + main_thread->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&MojoChannelInit::OnCreatedChannelOnMainThread, host,
|
| + io_thread, channel));
|
| +}
|
| +
|
| +// static
|
| +void MojoChannelInit::OnCreatedChannelOnMainThread(
|
| + base::WeakPtr<MojoChannelInit> host,
|
| + scoped_refptr<base::TaskRunner> io_thread,
|
| + mojo::embedder::ChannelInfo* channel) {
|
| + // By the time we get here |host| may have been destroyed. If so, shutdown the
|
| + // channel.
|
| + if (!host.get()) {
|
| + io_thread->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&mojo::embedder::DestroyChannelOnIOThread, channel));
|
| + return;
|
| + }
|
| + host->channel_info_ = channel;
|
| +}
|
| +
|
| +
|
| +} // namespace content
|
|
|