OLD | NEW |
| (Empty) |
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/in_process_native_runner.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/callback_helpers.h" | |
9 #include "base/location.h" | |
10 #include "base/message_loop/message_loop_proxy.h" | |
11 #include "base/threading/platform_thread.h" | |
12 #include "mojo/shell/native_application_support.h" | |
13 | |
14 namespace mojo { | |
15 namespace shell { | |
16 | |
17 InProcessNativeRunner::InProcessNativeRunner(Context* context) | |
18 : cleanup_(NativeApplicationCleanup::DONT_DELETE), app_library_(nullptr) { | |
19 } | |
20 | |
21 InProcessNativeRunner::~InProcessNativeRunner() { | |
22 // It is important to let the thread exit before unloading the DSO (when | |
23 // app_library_ is destructed), because the library may have registered | |
24 // thread-local data and destructors to run on thread termination. | |
25 if (thread_) { | |
26 DCHECK(thread_->HasBeenStarted()); | |
27 DCHECK(!thread_->HasBeenJoined()); | |
28 thread_->Join(); | |
29 } | |
30 } | |
31 | |
32 void InProcessNativeRunner::Start( | |
33 const base::FilePath& app_path, | |
34 NativeApplicationCleanup cleanup, | |
35 InterfaceRequest<Application> application_request, | |
36 const base::Closure& app_completed_callback) { | |
37 app_path_ = app_path; | |
38 cleanup_ = cleanup; | |
39 | |
40 DCHECK(!application_request_.is_pending()); | |
41 application_request_ = application_request.Pass(); | |
42 | |
43 DCHECK(app_completed_callback_runner_.is_null()); | |
44 app_completed_callback_runner_ = | |
45 base::Bind(&base::TaskRunner::PostTask, base::MessageLoopProxy::current(), | |
46 FROM_HERE, app_completed_callback); | |
47 | |
48 DCHECK(!thread_); | |
49 thread_.reset(new base::DelegateSimpleThread(this, "app_thread")); | |
50 thread_->Start(); | |
51 } | |
52 | |
53 void InProcessNativeRunner::Run() { | |
54 DVLOG(2) << "Loading/running Mojo app in process from library: " | |
55 << app_path_.value() | |
56 << " thread id=" << base::PlatformThread::CurrentId(); | |
57 | |
58 // TODO(vtl): ScopedNativeLibrary doesn't have a .get() method! | |
59 base::NativeLibrary app_library = LoadNativeApplication(app_path_, cleanup_); | |
60 app_library_.Reset(app_library); | |
61 RunNativeApplication(app_library, application_request_.Pass()); | |
62 app_completed_callback_runner_.Run(); | |
63 app_completed_callback_runner_.Reset(); | |
64 } | |
65 | |
66 scoped_ptr<NativeRunner> InProcessNativeRunnerFactory::Create( | |
67 const Options& options) { | |
68 return make_scoped_ptr(new InProcessNativeRunner(context_)); | |
69 } | |
70 | |
71 } // namespace shell | |
72 } // namespace mojo | |
OLD | NEW |