| Index: mojo/edk/embedder/embedder.cc
|
| diff --git a/mojo/edk/embedder/embedder.cc b/mojo/edk/embedder/embedder.cc
|
| index ca2169ab29809d768d4cf741d2ef66950ee24809..9c73eb0e1250159694cfcb534c30511aae58f578 100644
|
| --- a/mojo/edk/embedder/embedder.cc
|
| +++ b/mojo/edk/embedder/embedder.cc
|
| @@ -9,12 +9,13 @@
|
| #include "base/logging.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/message_loop/message_loop_proxy.h"
|
| +#include "mojo/edk/embedder/embedder_internal.h"
|
| #include "mojo/edk/embedder/platform_support.h"
|
| #include "mojo/edk/system/channel.h"
|
| #include "mojo/edk/system/channel_endpoint.h"
|
| -#include "mojo/edk/system/channel_info.h"
|
| +#include "mojo/edk/system/channel_manager.h"
|
| +#include "mojo/edk/system/configuration.h"
|
| #include "mojo/edk/system/core.h"
|
| -#include "mojo/edk/system/entrypoints.h"
|
| #include "mojo/edk/system/message_pipe_dispatcher.h"
|
| #include "mojo/edk/system/platform_handle_dispatcher.h"
|
| #include "mojo/edk/system/raw_channel.h"
|
| @@ -24,39 +25,41 @@ namespace embedder {
|
|
|
| namespace {
|
|
|
| -// Helper for |CreateChannel...()|. (Note: May return null for some failures.)
|
| -scoped_refptr<system::Channel> MakeChannel(
|
| - system::Core* core,
|
| +// Helper for |CreateChannel...()|. Returns 0 on failure. Called on the channel
|
| +// creation thread.
|
| +system::ChannelId MakeChannel(
|
| ScopedPlatformHandle platform_handle,
|
| scoped_refptr<system::ChannelEndpoint> channel_endpoint) {
|
| DCHECK(platform_handle.is_valid());
|
|
|
| // Create and initialize a |system::Channel|.
|
| + DCHECK(internal::g_core);
|
| scoped_refptr<system::Channel> channel =
|
| - new system::Channel(core->platform_support());
|
| + new system::Channel(internal::g_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>();
|
| + return 0;
|
| }
|
| - // Once |Init()| has succeeded, we have to return |channel| (since
|
| - // |Shutdown()| will have to be called on it).
|
|
|
| channel->AttachAndRunEndpoint(channel_endpoint, true);
|
| - return channel;
|
| +
|
| + DCHECK(internal::g_channel_manager);
|
| + return internal::g_channel_manager->AddChannel(
|
| + channel, base::MessageLoopProxy::current());
|
| }
|
|
|
| +// Helper for |CreateChannel()|. Called on the channel creation thread.
|
| 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);
|
| + channel_info->channel_id =
|
| + MakeChannel(platform_handle.Pass(), channel_endpoint);
|
|
|
| // Hand the channel back to the embedder.
|
| if (callback_thread_task_runner.get()) {
|
| @@ -69,8 +72,23 @@ void CreateChannelHelper(
|
|
|
| } // namespace
|
|
|
| +namespace internal {
|
| +
|
| +// Declared in embedder_internal.h.
|
| +system::Core* g_core = nullptr;
|
| +system::ChannelManager* g_channel_manager = nullptr;
|
| +
|
| +} // namespace internal
|
| +
|
| void Init(scoped_ptr<PlatformSupport> platform_support) {
|
| - system::entrypoints::SetCore(new system::Core(platform_support.Pass()));
|
| + DCHECK(!internal::g_core);
|
| + internal::g_core = new system::Core(platform_support.Pass());
|
| + DCHECK(!internal::g_channel_manager);
|
| + internal::g_channel_manager = new system::ChannelManager();
|
| +}
|
| +
|
| +Configuration* GetConfiguration() {
|
| + return system::GetMutableConfiguration();
|
| }
|
|
|
| // TODO(vtl): Write tests for this.
|
| @@ -84,14 +102,12 @@ ScopedMessagePipeHandle CreateChannelOnIOThread(
|
| scoped_refptr<system::MessagePipeDispatcher> dispatcher =
|
| system::MessagePipeDispatcher::CreateRemoteMessagePipe(&channel_endpoint);
|
|
|
| - system::Core* core = system::entrypoints::GetCore();
|
| - DCHECK(core);
|
| + DCHECK(internal::g_core);
|
| ScopedMessagePipeHandle rv(
|
| - MessagePipeHandle(core->AddDispatcher(dispatcher)));
|
| + MessagePipeHandle(internal::g_core->AddDispatcher(dispatcher)));
|
|
|
| - *channel_info = new ChannelInfo(
|
| - MakeChannel(core, platform_handle.Pass(), channel_endpoint),
|
| - base::MessageLoopProxy::current());
|
| + *channel_info =
|
| + new ChannelInfo(MakeChannel(platform_handle.Pass(), channel_endpoint));
|
|
|
| return rv.Pass();
|
| }
|
| @@ -109,24 +125,19 @@ ScopedMessagePipeHandle CreateChannel(
|
| scoped_refptr<system::MessagePipeDispatcher> dispatcher =
|
| system::MessagePipeDispatcher::CreateRemoteMessagePipe(&channel_endpoint);
|
|
|
| - system::Core* core = system::entrypoints::GetCore();
|
| - DCHECK(core);
|
| + DCHECK(internal::g_core);
|
| ScopedMessagePipeHandle rv(
|
| - MessagePipeHandle(core->AddDispatcher(dispatcher)));
|
| + MessagePipeHandle(internal::g_core->AddDispatcher(dispatcher)));
|
|
|
| + // We'll have to set |channel_info->channel_id| on the I/O thread.
|
| scoped_ptr<ChannelInfo> channel_info(new ChannelInfo());
|
| - // We'll have to set |channel_info->channel| on the I/O thread.
|
| - channel_info->channel_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));
|
| + io_thread_task_runner->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&CreateChannelHelper, 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)
|
| @@ -136,35 +147,25 @@ ScopedMessagePipeHandle CreateChannel(
|
| 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->channel_thread_task_runner.get());
|
| -
|
| - if (!channel_info->channel.get()) {
|
| + if (!channel_info->channel_id) {
|
| // Presumably, |Init()| on the channel failed.
|
| return;
|
| }
|
|
|
| - channel_info->channel->WillShutdownSoon();
|
| - channel_info->channel_thread_task_runner->PostTask(
|
| - FROM_HERE, base::Bind(&DestroyChannelOnIOThread, channel_info));
|
| + DCHECK(internal::g_channel_manager);
|
| + // This will destroy the channel synchronously if called from the channel
|
| + // thread.
|
| + internal::g_channel_manager->ShutdownChannel(channel_info->channel_id);
|
| + delete channel_info;
|
| }
|
|
|
| void WillDestroyChannelSoon(ChannelInfo* channel_info) {
|
| DCHECK(channel_info);
|
| - channel_info->channel->WillShutdownSoon();
|
| + DCHECK(internal::g_channel_manager);
|
| + internal::g_channel_manager->WillShutdownChannel(channel_info->channel_id);
|
| }
|
|
|
| MojoResult CreatePlatformHandleWrapper(
|
| @@ -175,9 +176,8 @@ MojoResult CreatePlatformHandleWrapper(
|
| scoped_refptr<system::Dispatcher> dispatcher(
|
| new system::PlatformHandleDispatcher(platform_handle.Pass()));
|
|
|
| - system::Core* core = system::entrypoints::GetCore();
|
| - DCHECK(core);
|
| - MojoHandle h = core->AddDispatcher(dispatcher);
|
| + DCHECK(internal::g_core);
|
| + MojoHandle h = internal::g_core->AddDispatcher(dispatcher);
|
| if (h == MOJO_HANDLE_INVALID) {
|
| LOG(ERROR) << "Handle table full";
|
| dispatcher->Close();
|
| @@ -192,10 +192,9 @@ MojoResult PassWrappedPlatformHandle(MojoHandle platform_handle_wrapper_handle,
|
| ScopedPlatformHandle* platform_handle) {
|
| DCHECK(platform_handle);
|
|
|
| - system::Core* core = system::entrypoints::GetCore();
|
| - DCHECK(core);
|
| + DCHECK(internal::g_core);
|
| scoped_refptr<system::Dispatcher> dispatcher(
|
| - core->GetDispatcher(platform_handle_wrapper_handle));
|
| + internal::g_core->GetDispatcher(platform_handle_wrapper_handle));
|
| if (!dispatcher.get())
|
| return MOJO_RESULT_INVALID_ARGUMENT;
|
|
|
|
|