32 lines
1019 B
C++
32 lines
1019 B
C++
// 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
|
|
|