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