1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "mojo/application/public/cpp/application_runner.h"
7 #include "base/at_exit.h"
8 #include "base/command_line.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/message_loop/message_loop.h"
11 #include "base/process/launch.h"
12 #include "base/threading/worker_pool.h"
13 #include "mojo/application/public/cpp/application_delegate.h"
14 #include "mojo/application/public/cpp/application_impl.h"
15 #include "mojo/message_pump/message_pump_mojo.h"
19 int g_application_runner_argc
;
20 const char* const* g_application_runner_argv
;
22 ApplicationRunner::ApplicationRunner(ApplicationDelegate
* delegate
)
23 : delegate_(scoped_ptr
<ApplicationDelegate
>(delegate
)),
24 message_loop_type_(base::MessageLoop::TYPE_CUSTOM
),
27 ApplicationRunner::~ApplicationRunner() {}
29 void ApplicationRunner::InitBaseCommandLine() {
30 base::CommandLine::Init(g_application_runner_argc
, g_application_runner_argv
);
33 void ApplicationRunner::set_message_loop_type(base::MessageLoop::Type type
) {
34 DCHECK_NE(base::MessageLoop::TYPE_CUSTOM
, type
);
37 message_loop_type_
= type
;
40 MojoResult
ApplicationRunner::Run(MojoHandle application_request_handle
,
45 scoped_ptr
<base::AtExitManager
> at_exit
;
47 InitBaseCommandLine();
48 at_exit
.reset(new base::AtExitManager
);
52 scoped_ptr
<base::MessageLoop
> loop
;
53 if (message_loop_type_
== base::MessageLoop::TYPE_CUSTOM
)
54 loop
.reset(new base::MessageLoop(common::MessagePumpMojo::Create()));
56 loop
.reset(new base::MessageLoop(message_loop_type_
));
58 ApplicationImpl
impl(delegate_
.get(),
59 MakeRequest
<Application
>(MakeScopedHandle(
60 MessagePipeHandle(application_request_handle
))));
62 // It's very common for the delegate to cache the app and terminate on
63 // errors. If we don't delete the delegate before the app we run the risk
64 // of the delegate having a stale reference to the app and trying to use it.
65 // Note that we destruct the message loop first because that might trigger
66 // connection error handlers and they might access objects created by the
72 // By default the worker pool continues running until all tasks are done or
73 // the process is shut down. However, because the application could be
74 // unloaded before process shutdown, we have to wait for the worker pool to
76 base::WorkerPool::ShutDownCleanly();
78 return MOJO_RESULT_OK
;
81 MojoResult
ApplicationRunner::Run(MojoHandle application_request_handle
) {
82 return Run(application_request_handle
, true);