Chromium Code Reviews| 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..b146ecac9d0bb338d3111a307e1f7ebd4fac1d77 |
| --- /dev/null |
| +++ b/content/common/mojo/mojo_channel_init.cc |
| @@ -0,0 +1,94 @@ |
| +// 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 { |
| + |
| +// Initializes mojo. Use a lock to ensure we only do this once. |
| +// TODO(sky): this likely wants to move to a more central location, such as |
| +// startup. |
| +void InitMojo() { |
| + static base::LazyInstance<base::Lock> lock = LAZY_INSTANCE_INITIALIZER; |
| + static bool inited = false; |
| + base::AutoLock auto_lock(lock.Get()); |
| + if (!inited) { |
| + inited = true; |
| + mojo::embedder::Init(); |
| + } |
| +} |
| + |
| +} // namespace |
| + |
| +MojoChannelInit::MojoChannelInit() |
| + : main_thread_(base::MessageLoop::current()->message_loop_proxy()), |
| + channel_info_(NULL), |
| + weak_factory_(this) { |
| +} |
| + |
| +MojoChannelInit::~MojoChannelInit() { |
| + handle_.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() == NULL); // Should only init once. |
|
viettrungluu
2014/03/13 23:02:36
Note: I imagine that even if we remove the scoped_
sky
2014/03/13 23:14:48
Done.
|
| + io_thread_task_runner_ = io_thread_task_runner; |
| + InitMojo(); |
| + handle_.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 |