Index: mojo/service_manager/background_shell_service_loader.h |
diff --git a/mojo/service_manager/background_service_loader.h b/mojo/service_manager/background_shell_service_loader.h |
similarity index 41% |
rename from mojo/service_manager/background_service_loader.h |
rename to mojo/service_manager/background_shell_service_loader.h |
index 253637adb6cfefb487ebce1db7fee5276561e98b..cbef942c290fb22e8baf1b68dba06845a171c0af 100644 |
--- a/mojo/service_manager/background_service_loader.h |
+++ b/mojo/service_manager/background_shell_service_loader.h |
@@ -2,27 +2,28 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#ifndef MOJO_SERVICE_MANAGER_BACKGROUND_SERVICE_LOADER_H_ |
-#define MOJO_SERVICE_MANAGER_BACKGROUND_SERVICE_LOADER_H_ |
+#ifndef MOJO_SERVICE_MANAGER_BACKGROUND_SHELL_SERVICE_LOADER_H_ |
+#define MOJO_SERVICE_MANAGER_BACKGROUND_SHELL_SERVICE_LOADER_H_ |
#include "base/memory/scoped_ptr.h" |
#include "base/message_loop/message_loop.h" |
-#include "base/threading/thread.h" |
+#include "base/synchronization/waitable_event.h" |
+#include "base/threading/simple_thread.h" |
#include "mojo/service_manager/service_loader.h" |
namespace mojo { |
-class ServiceManager; |
- |
-// ServiceLoader implementation that creates a background thread and issues load |
-// requests there. |
-class MOJO_SERVICE_MANAGER_EXPORT BackgroundServiceLoader |
- : public ServiceLoader { |
+// TODO(tim): Eventually this should be Android-only to support services |
+// that we need to bundle with the shell (such as NetworkService). Perhaps |
+// we should move it to shell/ as well. |
+class MOJO_SERVICE_MANAGER_EXPORT BackgroundShellServiceLoader : |
+ public ServiceLoader, |
+ public base::DelegateSimpleThread::Delegate { |
public: |
- BackgroundServiceLoader(scoped_ptr<ServiceLoader> real_loader, |
- const char* thread_name, |
- base::MessageLoop::Type message_loop_type); |
- virtual ~BackgroundServiceLoader(); |
+ BackgroundShellServiceLoader(scoped_ptr<ServiceLoader> real_loader, |
+ const std::string& thread_name, |
+ base::MessageLoop::Type message_loop_type); |
+ virtual ~BackgroundShellServiceLoader(); |
// ServiceLoader overrides: |
virtual void LoadService(ServiceManager* manager, |
@@ -31,9 +32,18 @@ class MOJO_SERVICE_MANAGER_EXPORT BackgroundServiceLoader |
virtual void OnServiceError(ServiceManager* manager, |
const GURL& url) OVERRIDE; |
+ // Post a task to quit the MessageLoop we are running for the app when we |
+ // are destroyed. Most apps should quit themselves and not need this. |
+ // TODO(tim): Remove this method once applications are smart enough |
+ // to quit themselves. Bug 394477. |
+ void set_quit_on_shutdown() { quit_on_shutdown_ = true; } |
+ |
private: |
class BackgroundLoader; |
+ // |base::DelegateSimpleThread::Delegate| method: |
+ virtual void Run() OVERRIDE; |
+ |
// These functions are exected on the background thread. They call through |
// to |background_loader_| to do the actual loading. |
// TODO: having this code take a |manager| is fragile (as ServiceManager isn't |
@@ -44,18 +54,30 @@ class MOJO_SERVICE_MANAGER_EXPORT BackgroundServiceLoader |
ScopedMessagePipeHandle* shell_handle); |
void OnServiceErrorOnBackgroundThread(ServiceManager* manager, |
const GURL& url); |
- void ShutdownOnBackgroundThread(); |
- |
+ bool quit_on_shutdown_; |
scoped_ptr<ServiceLoader> loader_; |
- base::Thread thread_; |
- base::MessageLoop::Type message_loop_type_; |
+ |
+ const base::MessageLoop::Type message_loop_type_; |
+ const std::string thread_name_; |
+ |
+ // Created on |thread_| during construction of |this|. Protected against |
+ // uninitialized use by |message_loop_created_|, and protected against |
+ // use-after-free by holding a reference to the thread-safe object. Note |
+ // that holding a reference won't hold |thread_| from exiting. |
+ scoped_refptr<base::TaskRunner> task_runner_; |
+ base::WaitableEvent message_loop_created_; |
+ |
+ // Lives on |thread_|. |
+ base::Closure quit_closure_; |
+ |
+ scoped_ptr<base::DelegateSimpleThread> thread_; |
// Lives on |thread_|. Trivial interface that calls through to |loader_|. |
BackgroundLoader* background_loader_; |
- DISALLOW_COPY_AND_ASSIGN(BackgroundServiceLoader); |
+ DISALLOW_COPY_AND_ASSIGN(BackgroundShellServiceLoader); |
}; |
} // namespace mojo |
-#endif // MOJO_SERVICE_MANAGER_BACKGROUND_SERVICE_LOADER_H_ |
+#endif // MOJO_SERVICE_MANAGER_BACKGROUND_SHELL_SERVICE_LOADER_H_ |