Index: mojo/embedder/embedder.cc |
diff --git a/mojo/embedder/embedder.cc b/mojo/embedder/embedder.cc |
deleted file mode 100644 |
index ca9bcd7d7ae932b56db28c721e201aa74340258b..0000000000000000000000000000000000000000 |
--- a/mojo/embedder/embedder.cc |
+++ /dev/null |
@@ -1,240 +0,0 @@ |
-// Copyright 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 "mojo/embedder/embedder.h" |
- |
-#include "base/bind.h" |
-#include "base/location.h" |
-#include "base/logging.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "mojo/embedder/platform_support.h" |
-#include "mojo/system/channel.h" |
-#include "mojo/system/channel_endpoint.h" |
-#include "mojo/system/core.h" |
-#include "mojo/system/entrypoints.h" |
-#include "mojo/system/message_in_transit.h" |
-#include "mojo/system/message_pipe_dispatcher.h" |
-#include "mojo/system/platform_handle_dispatcher.h" |
-#include "mojo/system/raw_channel.h" |
- |
-namespace mojo { |
-namespace embedder { |
- |
-// This is defined here (instead of a header file), since it's opaque to the |
-// outside world. But we need to define it before our (internal-only) functions |
-// that use it. |
-struct ChannelInfo { |
- ChannelInfo() {} |
- ~ChannelInfo() {} |
- |
- scoped_refptr<system::Channel> channel; |
- |
- // May be null, in which case |DestroyChannelOnIOThread()| must be used (from |
- // the IO thread), instead of |DestroyChannel()|. |
- scoped_refptr<base::TaskRunner> io_thread_task_runner; |
-}; |
- |
-namespace { |
- |
-// Helper for |CreateChannel...()|. (Note: May return null for some failures.) |
-scoped_refptr<system::Channel> MakeChannel( |
- system::Core* core, |
- ScopedPlatformHandle platform_handle, |
- scoped_refptr<system::ChannelEndpoint> channel_endpoint) { |
- DCHECK(platform_handle.is_valid()); |
- |
- // Create and initialize a |system::Channel|. |
- scoped_refptr<system::Channel> channel = |
- new system::Channel(core->platform_support()); |
- if (!channel->Init(system::RawChannel::Create(platform_handle.Pass()))) { |
- // This is very unusual (e.g., maybe |platform_handle| was invalid or we |
- // reached some system resource limit). |
- LOG(ERROR) << "Channel::Init() failed"; |
- // Return null, since |Shutdown()| shouldn't be called in this case. |
- return scoped_refptr<system::Channel>(); |
- } |
- // Once |Init()| has succeeded, we have to return |channel| (since |
- // |Shutdown()| will have to be called on it). |
- |
- // Attach the endpoint. |
- system::MessageInTransit::EndpointId endpoint_id = |
- channel->AttachEndpoint(channel_endpoint); |
- if (endpoint_id == system::MessageInTransit::kInvalidEndpointId) { |
- // This means that, e.g., the other endpoint of the message pipe was closed |
- // first. But it's not necessarily an error per se. |
- DVLOG(2) << "Channel::AttachEndpoint() failed"; |
- return channel; |
- } |
- CHECK_EQ(endpoint_id, system::Channel::kBootstrapEndpointId); |
- |
- if (!channel->RunMessagePipeEndpoint(system::Channel::kBootstrapEndpointId, |
- system::Channel::kBootstrapEndpointId)) { |
- // Currently, there's no reason for this to fail. |
- NOTREACHED() << "Channel::RunMessagePipeEndpoint() failed"; |
- return channel; |
- } |
- |
- return channel; |
-} |
- |
-void CreateChannelHelper( |
- system::Core* core, |
- ScopedPlatformHandle platform_handle, |
- scoped_ptr<ChannelInfo> channel_info, |
- scoped_refptr<system::ChannelEndpoint> channel_endpoint, |
- DidCreateChannelCallback callback, |
- scoped_refptr<base::TaskRunner> callback_thread_task_runner) { |
- channel_info->channel = |
- MakeChannel(core, platform_handle.Pass(), channel_endpoint); |
- |
- // Hand the channel back to the embedder. |
- if (callback_thread_task_runner.get()) { |
- callback_thread_task_runner->PostTask( |
- FROM_HERE, base::Bind(callback, channel_info.release())); |
- } else { |
- callback.Run(channel_info.release()); |
- } |
-} |
- |
-} // namespace |
- |
-void Init(scoped_ptr<PlatformSupport> platform_support) { |
- system::entrypoints::SetCore(new system::Core(platform_support.Pass())); |
-} |
- |
-// TODO(vtl): Write tests for this. |
-ScopedMessagePipeHandle CreateChannelOnIOThread( |
- ScopedPlatformHandle platform_handle, |
- ChannelInfo** channel_info) { |
- DCHECK(platform_handle.is_valid()); |
- DCHECK(channel_info); |
- |
- scoped_refptr<system::ChannelEndpoint> channel_endpoint; |
- scoped_refptr<system::MessagePipeDispatcher> dispatcher = |
- system::MessagePipeDispatcher::CreateRemoteMessagePipe(&channel_endpoint); |
- |
- system::Core* core = system::entrypoints::GetCore(); |
- DCHECK(core); |
- ScopedMessagePipeHandle rv( |
- MessagePipeHandle(core->AddDispatcher(dispatcher))); |
- |
- *channel_info = new ChannelInfo(); |
- (*channel_info)->channel = |
- MakeChannel(core, platform_handle.Pass(), channel_endpoint); |
- |
- return rv.Pass(); |
-} |
- |
-ScopedMessagePipeHandle CreateChannel( |
- ScopedPlatformHandle platform_handle, |
- scoped_refptr<base::TaskRunner> io_thread_task_runner, |
- DidCreateChannelCallback callback, |
- scoped_refptr<base::TaskRunner> callback_thread_task_runner) { |
- DCHECK(platform_handle.is_valid()); |
- |
- scoped_refptr<system::ChannelEndpoint> channel_endpoint; |
- scoped_refptr<system::MessagePipeDispatcher> dispatcher = |
- system::MessagePipeDispatcher::CreateRemoteMessagePipe(&channel_endpoint); |
- |
- system::Core* core = system::entrypoints::GetCore(); |
- DCHECK(core); |
- ScopedMessagePipeHandle rv( |
- MessagePipeHandle(core->AddDispatcher(dispatcher))); |
- |
- scoped_ptr<ChannelInfo> channel_info(new ChannelInfo()); |
- channel_info->io_thread_task_runner = io_thread_task_runner; |
- |
- if (rv.is_valid()) { |
- io_thread_task_runner->PostTask(FROM_HERE, |
- base::Bind(&CreateChannelHelper, |
- base::Unretained(core), |
- base::Passed(&platform_handle), |
- base::Passed(&channel_info), |
- channel_endpoint, |
- callback, |
- callback_thread_task_runner)); |
- } else { |
- (callback_thread_task_runner.get() ? callback_thread_task_runner |
- : io_thread_task_runner) |
- ->PostTask(FROM_HERE, base::Bind(callback, channel_info.release())); |
- } |
- |
- return rv.Pass(); |
-} |
- |
-void DestroyChannelOnIOThread(ChannelInfo* channel_info) { |
- DCHECK(channel_info); |
- if (!channel_info->channel.get()) { |
- // Presumably, |Init()| on the channel failed. |
- return; |
- } |
- |
- channel_info->channel->Shutdown(); |
- delete channel_info; |
-} |
- |
-// TODO(vtl): Write tests for this. |
-void DestroyChannel(ChannelInfo* channel_info) { |
- DCHECK(channel_info); |
- DCHECK(channel_info->io_thread_task_runner.get()); |
- |
- if (!channel_info->channel.get()) { |
- // Presumably, |Init()| on the channel failed. |
- return; |
- } |
- |
- channel_info->channel->WillShutdownSoon(); |
- channel_info->io_thread_task_runner->PostTask( |
- FROM_HERE, base::Bind(&DestroyChannelOnIOThread, channel_info)); |
-} |
- |
-void WillDestroyChannelSoon(ChannelInfo* channel_info) { |
- DCHECK(channel_info); |
- channel_info->channel->WillShutdownSoon(); |
-} |
- |
-MojoResult CreatePlatformHandleWrapper( |
- ScopedPlatformHandle platform_handle, |
- MojoHandle* platform_handle_wrapper_handle) { |
- DCHECK(platform_handle_wrapper_handle); |
- |
- scoped_refptr<system::Dispatcher> dispatcher( |
- new system::PlatformHandleDispatcher(platform_handle.Pass())); |
- |
- system::Core* core = system::entrypoints::GetCore(); |
- DCHECK(core); |
- MojoHandle h = core->AddDispatcher(dispatcher); |
- if (h == MOJO_HANDLE_INVALID) { |
- LOG(ERROR) << "Handle table full"; |
- dispatcher->Close(); |
- return MOJO_RESULT_RESOURCE_EXHAUSTED; |
- } |
- |
- *platform_handle_wrapper_handle = h; |
- return MOJO_RESULT_OK; |
-} |
- |
-MojoResult PassWrappedPlatformHandle(MojoHandle platform_handle_wrapper_handle, |
- ScopedPlatformHandle* platform_handle) { |
- DCHECK(platform_handle); |
- |
- system::Core* core = system::entrypoints::GetCore(); |
- DCHECK(core); |
- scoped_refptr<system::Dispatcher> dispatcher( |
- core->GetDispatcher(platform_handle_wrapper_handle)); |
- if (!dispatcher.get()) |
- return MOJO_RESULT_INVALID_ARGUMENT; |
- |
- if (dispatcher->GetType() != system::Dispatcher::kTypePlatformHandle) |
- return MOJO_RESULT_INVALID_ARGUMENT; |
- |
- *platform_handle = |
- static_cast<system::PlatformHandleDispatcher*>(dispatcher.get()) |
- ->PassPlatformHandle() |
- .Pass(); |
- return MOJO_RESULT_OK; |
-} |
- |
-} // namespace embedder |
-} // namespace mojo |