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 |