blob: ee5e58d0057776807780471afdc439c97856d4c9 [file] [log] [blame] [edit]
// 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