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/service_manager/background_service_loader.h"
8 #include "mojo/service_manager/service_manager.h"
12 class BackgroundServiceLoader::BackgroundLoader
{
14 explicit BackgroundLoader(ServiceLoader
* loader
) : loader_(loader
) {}
15 ~BackgroundLoader() {}
17 void LoadService(ServiceManager
* manager
,
19 ScopedMessagePipeHandle shell_handle
) {
20 loader_
->LoadService(manager
, url
, shell_handle
.Pass());
23 void OnServiceError(ServiceManager
* manager
, const GURL
& url
) {
24 loader_
->OnServiceError(manager
, url
);
28 base::MessageLoop::Type message_loop_type_
;
29 ServiceLoader
* loader_
; // Owned by BackgroundServiceLoader
31 DISALLOW_COPY_AND_ASSIGN(BackgroundLoader
);
34 BackgroundServiceLoader::BackgroundServiceLoader(
35 scoped_ptr
<ServiceLoader
> real_loader
,
36 const char* thread_name
,
37 base::MessageLoop::Type message_loop_type
)
38 : loader_(real_loader
.Pass()),
40 message_loop_type_(message_loop_type
),
41 background_loader_(NULL
) {
44 BackgroundServiceLoader::~BackgroundServiceLoader() {
45 if (thread_
.IsRunning()) {
46 thread_
.message_loop()->PostTask(
48 base::Bind(&BackgroundServiceLoader::ShutdownOnBackgroundThread
,
49 base::Unretained(this)));
54 void BackgroundServiceLoader::LoadService(
55 ServiceManager
* manager
,
57 ScopedMessagePipeHandle shell_handle
) {
58 const int kDefaultStackSize
= 0;
59 if (!thread_
.IsRunning()) {
60 thread_
.StartWithOptions(
61 base::Thread::Options(message_loop_type_
, kDefaultStackSize
));
63 thread_
.message_loop()->PostTask(
65 base::Bind(&BackgroundServiceLoader::LoadServiceOnBackgroundThread
,
66 base::Unretained(this), manager
, url
,
68 new ScopedMessagePipeHandle(shell_handle
.Pass()))));
71 void BackgroundServiceLoader::OnServiceError(ServiceManager
* manager
,
73 if (!thread_
.IsRunning())
75 thread_
.message_loop()->PostTask(
77 base::Bind(&BackgroundServiceLoader::OnServiceErrorOnBackgroundThread
,
78 base::Unretained(this), manager
, url
));
81 void BackgroundServiceLoader::LoadServiceOnBackgroundThread(
82 ServiceManager
* manager
,
84 ScopedMessagePipeHandle
* shell_handle
) {
85 if (!background_loader_
)
86 background_loader_
= new BackgroundLoader(loader_
.get());
87 background_loader_
->LoadService(
88 manager
, url
, shell_handle
->Pass());
91 void BackgroundServiceLoader::OnServiceErrorOnBackgroundThread(
92 ServiceManager
* manager
,
94 if (!background_loader_
)
95 background_loader_
= new BackgroundLoader(loader_
.get());
96 background_loader_
->OnServiceError(manager
, url
);
99 void BackgroundServiceLoader::ShutdownOnBackgroundThread() {
100 delete background_loader_
;
101 // Destroy |loader_| on the thread it's actually used on.