• 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 #ifndef MOJO_SERVICE_MANAGER_BACKGROUND_SERVICE_LOADER_H_
6 #define MOJO_SERVICE_MANAGER_BACKGROUND_SERVICE_LOADER_H_
7 
8 #include "base/memory/scoped_ptr.h"
9 #include "base/message_loop/message_loop.h"
10 #include "base/threading/thread.h"
11 #include "mojo/service_manager/service_loader.h"
12 
13 namespace mojo {
14 
15 class ServiceManager;
16 
17 // ServiceLoader implementation that creates a background thread and issues load
18 // requests there.
19 class MOJO_SERVICE_MANAGER_EXPORT BackgroundServiceLoader
20     : public ServiceLoader {
21  public:
22   BackgroundServiceLoader(scoped_ptr<ServiceLoader> real_loader,
23                           const char* thread_name,
24                           base::MessageLoop::Type message_loop_type);
25   virtual ~BackgroundServiceLoader();
26 
27   // ServiceLoader overrides:
28   virtual void LoadService(ServiceManager* manager,
29                            const GURL& url,
30                            ScopedMessagePipeHandle service_handle) OVERRIDE;
31   virtual void OnServiceError(ServiceManager* manager,
32                               const GURL& url) OVERRIDE;
33 
34  private:
35   class BackgroundLoader;
36 
37   // These functions are exected on the background thread. They call through
38   // to |background_loader_| to do the actual loading.
39   // TODO: having this code take a |manager| is fragile (as ServiceManager isn't
40   // thread safe).
41   void LoadServiceOnBackgroundThread(
42       ServiceManager* manager,
43       const GURL& url,
44       ScopedMessagePipeHandle* service_provider_handle);
45   void OnServiceErrorOnBackgroundThread(ServiceManager* manager,
46                                         const GURL& url);
47   void ShutdownOnBackgroundThread();
48 
49   scoped_ptr<ServiceLoader> loader_;
50   base::Thread thread_;
51   base::MessageLoop::Type message_loop_type_;
52 
53   // Lives on |thread_|. Trivial interface that calls through to |loader_|.
54   BackgroundLoader* background_loader_;
55 
56   DISALLOW_COPY_AND_ASSIGN(BackgroundServiceLoader);
57 };
58 
59 }  // namespace mojo
60 
61 #endif  // MOJO_SERVICE_MANAGER_BACKGROUND_SERVICE_LOADER_H_
62