Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(174)

Unified Diff: ui/aura/env.cc

Issue 285793002: Makes Env thread local (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/aura/env.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/aura/env.cc
diff --git a/ui/aura/env.cc b/ui/aura/env.cc
index 6fa86da46270299fc470ab318286c42ae32ddba6..c850f03ac2819adb1d1309cbd6ccf7098cb331c7 100644
--- a/ui/aura/env.cc
+++ b/ui/aura/env.cc
@@ -4,6 +4,8 @@
#include "ui/aura/env.h"
+#include "base/lazy_instance.h"
+#include "base/threading/thread_local.h"
#include "ui/aura/env_observer.h"
#include "ui/aura/input_state_lookup.h"
#include "ui/events/event_target_iterator.h"
@@ -11,41 +13,34 @@
namespace aura {
-// static
-Env* Env::instance_ = NULL;
+namespace {
-////////////////////////////////////////////////////////////////////////////////
-// Env, public:
+// Env is thread local so that aura may be used on multiple threads.
+base::LazyInstance<base::ThreadLocalPointer<Env> >::Leaky lazy_tls_ptr =
+ LAZY_INSTANCE_INITIALIZER;
-Env::Env()
- : mouse_button_flags_(0),
- is_touch_down_(false),
- input_state_lookup_(InputStateLookup::Create().Pass()) {
-}
+} // namespace
-Env::~Env() {
- FOR_EACH_OBSERVER(EnvObserver, observers_, OnWillDestroyEnv());
-}
+////////////////////////////////////////////////////////////////////////////////
+// Env, public:
-//static
+// static
void Env::CreateInstance(bool create_event_source) {
- if (!instance_) {
- instance_ = new Env;
- instance_->Init(create_event_source);
- }
+ if (!lazy_tls_ptr.Pointer()->Get())
+ (new Env())->Init(create_event_source);
}
// static
Env* Env::GetInstance() {
- DCHECK(instance_) << "Env::CreateInstance must be called before getting "
- "the instance of Env.";
- return instance_;
+ Env* env = lazy_tls_ptr.Pointer()->Get();
+ DCHECK(env) << "Env::CreateInstance must be called before getting the "
+ "instance of Env.";
+ return env;
}
// static
void Env::DeleteInstance() {
- delete instance_;
- instance_ = NULL;
+ delete lazy_tls_ptr.Pointer()->Get();
}
void Env::AddObserver(EnvObserver* observer) {
@@ -64,6 +59,20 @@ bool Env::IsMouseButtonDown() const {
////////////////////////////////////////////////////////////////////////////////
// Env, private:
+Env::Env()
+ : mouse_button_flags_(0),
+ is_touch_down_(false),
+ input_state_lookup_(InputStateLookup::Create().Pass()) {
+ DCHECK(lazy_tls_ptr.Pointer()->Get() == NULL);
+ lazy_tls_ptr.Pointer()->Set(this);
+}
+
+Env::~Env() {
+ FOR_EACH_OBSERVER(EnvObserver, observers_, OnWillDestroyEnv());
+ DCHECK_EQ(this, lazy_tls_ptr.Pointer()->Get());
+ lazy_tls_ptr.Pointer()->Set(NULL);
+}
+
void Env::Init(bool create_event_source) {
if (create_event_source && !ui::PlatformEventSource::GetInstance())
event_source_ = ui::PlatformEventSource::CreateDefault();
« no previous file with comments | « ui/aura/env.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698