//===- LazyAtomicPointer.----------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLVM_ADT_LAZYATOMICPOINTER_H #define LLVM_ADT_LAZYATOMICPOINTER_H #include "llvm/ADT/STLFunctionalExtras.h" #include "llvm/Support/Compiler.h" #include <assert.h> #include <atomic> namespace llvm { /// Atomic pointer that's lock-free, but that can coordinate concurrent writes /// from a lazy generator. Should be reserved for cases where concurrent uses of /// a generator for the same storage is unlikely. /// /// The laziness comes in with \a loadOrGenerate(), which lazily calls the /// provided generator ONLY when the value is currently \c nullptr. With /// concurrent calls, only one generator is called and the rest see that value. /// /// Most other APIs treat an in-flight \a loadOrGenerate() as if \c nullptr /// were stored. APIs that are required to write a value will spin. /// /// The underlying storage is \a std::atomic<uintptr_t>. /// /// TODO: In C++20, use std::atomic<T>::wait() instead of spinning and call /// std::atomic<T>::notify_all() in \a loadOrGenerate(). template <class T> class LazyAtomicPointer { … }; } // end namespace llvm #endif // LLVM_ADT_LAZYATOMICPOINTER_H