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