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

Unified Diff: base/lazy_instance.cc

Issue 8491043: Allow linker initialization of lazy instance (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: review comments + rebase Created 9 years, 1 month 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
Index: base/lazy_instance.cc
diff --git a/base/lazy_instance.cc b/base/lazy_instance.cc
index 1be34883a77b24563f2e8633a1d9729baa01533f..2634ee114f2c8826150fbd714e30f78f11792ed5 100644
--- a/base/lazy_instance.cc
+++ b/base/lazy_instance.cc
@@ -11,15 +11,18 @@
#include "base/third_party/dynamic_annotations/dynamic_annotations.h"
namespace base {
+namespace internal {
-bool LazyInstanceHelper::NeedsInstance() {
+// TODO(joth): This function could be shared with Singleton, in place of its
+// WaitForInstance() call.
+bool NeedsLazyInstance(subtle::AtomicWord* state) {
// Try to create the instance, if we're the first, will go from EMPTY
// to CREATING, otherwise we've already been beaten here.
// The memory access has no memory ordering as STATE_EMPTY and STATE_CREATING
// has no associated data (memory barriers are all about ordering
// of memory accesses to *associated* data).
- if (base::subtle::NoBarrier_CompareAndSwap(
- &state_, STATE_EMPTY, STATE_CREATING) == STATE_EMPTY)
+ if (subtle::NoBarrier_CompareAndSwap(state, 0,
+ kLazyInstanceStateCreating) == 0)
// Caller must create instance
return true;
@@ -28,28 +31,29 @@ bool LazyInstanceHelper::NeedsInstance() {
// state_ == STATE_CREATED needs to acquire visibility over
// the associated data (buf_). Pairing Release_Store is in
// CompleteInstance().
willchan no longer on Chromium 2011/11/14 17:29:06 s/CompleteInstance/CompleteLazyInstance/g
joth 2011/11/15 11:40:41 Done.
- while (base::subtle::Acquire_Load(&state_) != STATE_CREATED)
+ while (subtle::Acquire_Load(state) == kLazyInstanceStateCreating) {
PlatformThread::YieldCurrentThread();
-
+ }
// Someone else created the instance.
return false;
}
-void LazyInstanceHelper::CompleteInstance(void* instance, void (*dtor)(void*)) {
+void CompleteLazyInstance(subtle::AtomicWord* state,
+ subtle::AtomicWord new_instance,
+ void* lazy_instance,
+ void (*dtor)(void*)) {
// See the comment to the corresponding HAPPENS_AFTER in Pointer().
- ANNOTATE_HAPPENS_BEFORE(&state_);
+ ANNOTATE_HAPPENS_BEFORE(state);
// Instance is created, go from CREATING to CREATED.
- // Releases visibility over buf_ to readers. Pairing Acquire_Load's are in
- // NeedsInstance() and Pointer().
- base::subtle::Release_Store(&state_, STATE_CREATED);
+ // Releases visibility over private_buf_ to readers. Pairing Acquire_Load's
+ // are in NeedsInstance() and Pointer().
+ subtle::Release_Store(state, new_instance);
// Make sure that the lazily instantiated object will get destroyed at exit.
if (dtor)
- base::AtExitManager::RegisterCallback(dtor, instance);
+ AtExitManager::RegisterCallback(dtor, lazy_instance);
}
+} // namespace internal
} // namespace base
-
-
-
« base/lazy_instance.h ('K') | « base/lazy_instance.h ('k') | base/lazy_instance_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698