diff options
Diffstat (limited to 'include/llvm/Support/ManagedStatic.h')
-rw-r--r-- | include/llvm/Support/ManagedStatic.h | 53 |
1 files changed, 20 insertions, 33 deletions
diff --git a/include/llvm/Support/ManagedStatic.h b/include/llvm/Support/ManagedStatic.h index 2e131e47177d3..ec8154b828e59 100644 --- a/include/llvm/Support/ManagedStatic.h +++ b/include/llvm/Support/ManagedStatic.h @@ -14,25 +14,26 @@ #ifndef LLVM_SUPPORT_MANAGEDSTATIC_H #define LLVM_SUPPORT_MANAGEDSTATIC_H -#include "llvm/Support/Atomic.h" #include "llvm/Support/Compiler.h" -#include "llvm/Support/Threading.h" +#include <atomic> +#include <cstddef> namespace llvm { /// object_creator - Helper method for ManagedStatic. template<class C> -void* object_creator() { +LLVM_LIBRARY_VISIBILITY void* object_creator() { return new C(); } /// object_deleter - Helper method for ManagedStatic. /// -template<typename T> struct object_deleter { - static void call(void * Ptr) { delete (T*)Ptr; } +template <typename T> struct LLVM_LIBRARY_VISIBILITY object_deleter { + static void call(void *Ptr) { delete (T *)Ptr; } }; -template<typename T, size_t N> struct object_deleter<T[N]> { - static void call(void * Ptr) { delete[] (T*)Ptr; } +template <typename T, size_t N> +struct LLVM_LIBRARY_VISIBILITY object_deleter<T[N]> { + static void call(void *Ptr) { delete[](T *)Ptr; } }; /// ManagedStaticBase - Common base class for ManagedStatic instances. @@ -40,7 +41,7 @@ class ManagedStaticBase { protected: // This should only be used as a static variable, which guarantees that this // will be zero initialized. - mutable void *Ptr; + mutable std::atomic<void *> Ptr; mutable void (*DeleterFn)(void*); mutable const ManagedStaticBase *Next; @@ -60,40 +61,26 @@ public: template<class C> class ManagedStatic : public ManagedStaticBase { public: - // Accessors. C &operator*() { - void* tmp = Ptr; - if (llvm_is_multithreaded()) sys::MemoryFence(); - if (!tmp) RegisterManagedStatic(object_creator<C>, object_deleter<C>::call); - TsanHappensAfter(this); + void *Tmp = Ptr.load(std::memory_order_acquire); + if (!Tmp) + RegisterManagedStatic(object_creator<C>, object_deleter<C>::call); - return *static_cast<C*>(Ptr); + return *static_cast<C *>(Ptr.load(std::memory_order_relaxed)); } - C *operator->() { - void* tmp = Ptr; - if (llvm_is_multithreaded()) sys::MemoryFence(); - if (!tmp) RegisterManagedStatic(object_creator<C>, object_deleter<C>::call); - TsanHappensAfter(this); - return static_cast<C*>(Ptr); - } + C *operator->() { return &**this; } + const C &operator*() const { - void* tmp = Ptr; - if (llvm_is_multithreaded()) sys::MemoryFence(); - if (!tmp) RegisterManagedStatic(object_creator<C>, object_deleter<C>::call); - TsanHappensAfter(this); + void *Tmp = Ptr.load(std::memory_order_acquire); + if (!Tmp) + RegisterManagedStatic(object_creator<C>, object_deleter<C>::call); - return *static_cast<C*>(Ptr); + return *static_cast<C *>(Ptr.load(std::memory_order_relaxed)); } - const C *operator->() const { - void* tmp = Ptr; - if (llvm_is_multithreaded()) sys::MemoryFence(); - if (!tmp) RegisterManagedStatic(object_creator<C>, object_deleter<C>::call); - TsanHappensAfter(this); - return static_cast<C*>(Ptr); - } + const C *operator->() const { return &**this; } }; /// llvm_shutdown - Deallocate and destroy all ManagedStatic variables. |