| // 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) { |
| value = subtle::NoBarrier_Load(instance); |
| if (value != kBeingCreatedMarker) |
| break; |
| PlatformThread::YieldCurrentThread(); |
| } |
| return value; |
| } |
| |
| } // namespace internal |
| } // namespace base |
| |