Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / mojo / common / handle_watcher.cc
index 150305c..a95669c 100644 (file)
 #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 ---------------------------------------------------