| Index: mojo/common/handle_watcher.cc
|
| diff --git a/mojo/common/handle_watcher.cc b/mojo/common/handle_watcher.cc
|
| index 150305c00f264a9bcf958c693b4de99989b72ce6..a95669c5803056037723de81df2a84e391fd7881 100644
|
| --- a/mojo/common/handle_watcher.cc
|
| +++ b/mojo/common/handle_watcher.cc
|
| @@ -12,8 +12,10 @@
|
| #include "base/memory/weak_ptr.h"
|
| #include "base/message_loop/message_loop.h"
|
| #include "base/message_loop/message_loop_proxy.h"
|
| +#include "base/synchronization/lock.h"
|
| #include "base/threading/thread.h"
|
| #include "base/time/time.h"
|
| +#include "mojo/common/environment_data.h"
|
| #include "mojo/common/message_pump_mojo.h"
|
| #include "mojo/common/message_pump_mojo_handler.h"
|
| #include "mojo/common/time_helper.h"
|
| @@ -27,6 +29,8 @@ namespace {
|
|
|
| const char kWatcherThreadName[] = "handle-watcher-thread";
|
|
|
| +const char kWatcherThreadManagerKey[] = "watcher-thread-manager";
|
| +
|
| // TODO(sky): this should be unnecessary once MessageLoop has been refactored.
|
| MessagePumpMojo* message_pump_mojo = NULL;
|
|
|
| @@ -153,6 +157,8 @@ void WatcherBackend::OnHandleError(const Handle& handle, MojoResult result) {
|
| // to be ready. All requests are handled by WatcherBackend.
|
| class WatcherThreadManager {
|
| public:
|
| + ~WatcherThreadManager();
|
| +
|
| // Returns the shared instance.
|
| static WatcherThreadManager* GetInstance();
|
|
|
| @@ -170,10 +176,7 @@ class WatcherThreadManager {
|
| void StopWatching(WatcherID watcher_id);
|
|
|
| private:
|
| - friend struct base::DefaultLazyInstanceTraits<WatcherThreadManager>;
|
| -
|
| WatcherThreadManager();
|
| - ~WatcherThreadManager();
|
|
|
| base::Thread thread_;
|
|
|
| @@ -184,10 +187,29 @@ class WatcherThreadManager {
|
| DISALLOW_COPY_AND_ASSIGN(WatcherThreadManager);
|
| };
|
|
|
| +struct WatcherThreadManagerData : EnvironmentData::Data {
|
| + scoped_ptr<WatcherThreadManager> thread_manager;
|
| +};
|
| +
|
| +WatcherThreadManager::~WatcherThreadManager() {
|
| + thread_.Stop();
|
| +}
|
| +
|
| +static base::LazyInstance<base::Lock> thread_lookup_lock =
|
| + LAZY_INSTANCE_INITIALIZER;
|
| +
|
| WatcherThreadManager* WatcherThreadManager::GetInstance() {
|
| - static base::LazyInstance<WatcherThreadManager> instance =
|
| - LAZY_INSTANCE_INITIALIZER;
|
| - return &instance.Get();
|
| + base::AutoLock auto_lock(thread_lookup_lock.Get());
|
| + WatcherThreadManagerData* data = static_cast<WatcherThreadManagerData*>(
|
| + EnvironmentData::GetInstance()->GetData(kWatcherThreadManagerKey));
|
| + if (!data) {
|
| + data = new WatcherThreadManagerData;
|
| + data->thread_manager.reset(new WatcherThreadManager);
|
| + EnvironmentData::GetInstance()->SetData(
|
| + kWatcherThreadManagerKey,
|
| + scoped_ptr<EnvironmentData::Data>(data));
|
| + }
|
| + return data->thread_manager.get();
|
| }
|
|
|
| WatcherID WatcherThreadManager::StartWatching(
|
| @@ -229,10 +251,6 @@ WatcherThreadManager::WatcherThreadManager()
|
| thread_.StartWithOptions(thread_options);
|
| }
|
|
|
| -WatcherThreadManager::~WatcherThreadManager() {
|
| - thread_.Stop();
|
| -}
|
| -
|
| } // namespace
|
|
|
| // HandleWatcher::StartState ---------------------------------------------------
|
|
|