// Copyright (c) 2011 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/memory/singleton.h" #include "base/threading/platform_thread.h" namespace base { namespace internal { subtle::AtomicWord WaitForInstance(subtle::AtomicWord* instance) { // Handle the race. Another thread beat us and either: // - Has the object in BeingCreated state // - Already has the object created... // We know value != NULL. It could be kBeingCreatedMarker, or a valid ptr. // Unless your constructor can be very time consuming, it is very unlikely // to hit this race. When it does, we just spin and yield the thread until // the object has been created. subtle::AtomicWord value; while (true) { // The load has acquire memory ordering as the thread which reads the // instance pointer must acquire visibility over the associated data. // The pairing Release_Store operation is in Singleton::get(). value = subtle::Acquire_Load(instance); if (value != kBeingCreatedMarker) break; PlatformThread::YieldCurrentThread(); } return value; } } // namespace internal } // namespace base