• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
4 
5 #include "mojo/shell/out_of_process_dynamic_service_runner.h"
6 
7 #include "base/bind.h"
8 #include "base/callback_helpers.h"
9 #include "base/file_util.h"
10 #include "base/logging.h"
11 #include "base/scoped_native_library.h"
12 
13 namespace mojo {
14 namespace shell {
15 
OutOfProcessDynamicServiceRunner(Context * context)16 OutOfProcessDynamicServiceRunner::OutOfProcessDynamicServiceRunner(
17     Context* context)
18     : context_(context),
19       keep_alive_(context) {
20 }
21 
~OutOfProcessDynamicServiceRunner()22 OutOfProcessDynamicServiceRunner::~OutOfProcessDynamicServiceRunner() {
23   if (app_child_process_host_) {
24     // TODO(vtl): Race condition: If |AppChildProcessHost::DidStart()| hasn't
25     // been called yet, we shouldn't call |Join()| here. (Until |DidStart()|, we
26     // may not have a child process to wait on.) Probably we should fix
27     // |Join()|.
28     app_child_process_host_->Join();
29   }
30 }
31 
Start(const base::FilePath & app_path,ScopedMessagePipeHandle service_handle,const base::Closure & app_completed_callback)32 void OutOfProcessDynamicServiceRunner::Start(
33     const base::FilePath& app_path,
34     ScopedMessagePipeHandle service_handle,
35     const base::Closure& app_completed_callback) {
36   app_path_ = app_path;
37 
38   DCHECK(!service_handle_.is_valid());
39   service_handle_ = service_handle.Pass();
40 
41   DCHECK(app_completed_callback_.is_null());
42   app_completed_callback_ = app_completed_callback;
43 
44   app_child_process_host_.reset(new AppChildProcessHost(context_, this));
45   app_child_process_host_->Start();
46 
47   // TODO(vtl): |app_path.AsUTF8Unsafe()| is unsafe.
48   app_child_process_host_->controller()->StartApp(
49       app_path.AsUTF8Unsafe(),
50       ScopedMessagePipeHandle(MessagePipeHandle(
51           service_handle.release().value())));
52 }
53 
AppCompleted(int32_t result)54 void OutOfProcessDynamicServiceRunner::AppCompleted(int32_t result) {
55   DVLOG(2) << "OutOfProcessDynamicServiceRunner::AppCompleted(" << result
56            << ")";
57 
58   app_completed_callback_.Run();
59   app_completed_callback_.Reset();
60   app_child_process_host_.reset();
61 }
62 
63 }  // namespace shell
64 }  // namespace mojo
65