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

Unified Diff: base/lazy_instance.cc

Issue 519045: Refactor lazy_instance to avoid a strict aliasing problem with gcc 4.4. (Closed)
Patch Set: Remove extra MemoryBarrier Created 10 years, 11 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 | « base/lazy_instance.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/lazy_instance.cc
diff --git a/base/lazy_instance.cc b/base/lazy_instance.cc
deleted file mode 100644
index 992325339cfcbabf3babf92dee3488cd55c2f862..0000000000000000000000000000000000000000
--- a/base/lazy_instance.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) 2008 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/lazy_instance.h"
-
-#include "base/at_exit.h"
-#include "base/atomicops.h"
-#include "base/dynamic_annotations.h"
-#include "base/basictypes.h"
-#include "base/platform_thread.h"
-
-namespace base {
-
-void LazyInstanceHelper::EnsureInstance(void* instance,
- void (*ctor)(void*),
- void (*dtor)(void*)) {
- // Try to create the instance, if we're the first, will go from EMPTY
- // to CREATING, otherwise we've already been beaten here.
- if (base::subtle::Acquire_CompareAndSwap(
- &state_, STATE_EMPTY, STATE_CREATING) == STATE_EMPTY) {
- // Created the instance in the space provided by |instance|.
- ctor(instance);
-
- // See the comment to the corresponding HAPPENS_AFTER in Pointer().
- ANNOTATE_HAPPENS_BEFORE(&state_);
-
- // Instance is created, go from CREATING to CREATED.
- base::subtle::Release_Store(&state_, STATE_CREATED);
-
- // Allow reusing the LazyInstance (reset it to the initial state). This
- // makes possible calling all AtExit callbacks between tests. Assumes that
- // no other threads execute when AtExit callbacks are processed.
- base::AtExitManager::RegisterCallback(&LazyInstanceHelper::ResetState,
- this);
-
- // Make sure that the lazily instantiated object will get destroyed at exit.
- base::AtExitManager::RegisterCallback(dtor, instance);
- } else {
- // It's either in the process of being created, or already created. Spin.
- while (base::subtle::NoBarrier_Load(&state_) != STATE_CREATED)
- PlatformThread::YieldCurrentThread();
- }
-}
-
-// static
-void LazyInstanceHelper::ResetState(void* helper) {
- reinterpret_cast<LazyInstanceHelper*>(helper)->state_ = STATE_EMPTY;
-}
-
-} // namespace base
« no previous file with comments | « base/lazy_instance.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698