// 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