1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker // 5*6777b538SAndroid Build Coastguard Worker // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! DEPRECATED !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 6*6777b538SAndroid Build Coastguard Worker // Please don't introduce new instances of LazyInstance<T>. Use a function-local 7*6777b538SAndroid Build Coastguard Worker // static of type base::NoDestructor<T> instead: 8*6777b538SAndroid Build Coastguard Worker // 9*6777b538SAndroid Build Coastguard Worker // Factory& Factory::GetInstance() { 10*6777b538SAndroid Build Coastguard Worker // static base::NoDestructor<Factory> instance; 11*6777b538SAndroid Build Coastguard Worker // return *instance; 12*6777b538SAndroid Build Coastguard Worker // } 13*6777b538SAndroid Build Coastguard Worker // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 14*6777b538SAndroid Build Coastguard Worker // 15*6777b538SAndroid Build Coastguard Worker // The LazyInstance<Type, Traits> class manages a single instance of Type, 16*6777b538SAndroid Build Coastguard Worker // which will be lazily created on the first time it's accessed. This class is 17*6777b538SAndroid Build Coastguard Worker // useful for places you would normally use a function-level static, but you 18*6777b538SAndroid Build Coastguard Worker // need to have guaranteed thread-safety. The Type constructor will only ever 19*6777b538SAndroid Build Coastguard Worker // be called once, even if two threads are racing to create the object. Get() 20*6777b538SAndroid Build Coastguard Worker // and Pointer() will always return the same, completely initialized instance. 21*6777b538SAndroid Build Coastguard Worker // When the instance is constructed it is registered with AtExitManager. The 22*6777b538SAndroid Build Coastguard Worker // destructor will be called on program exit. 23*6777b538SAndroid Build Coastguard Worker // 24*6777b538SAndroid Build Coastguard Worker // LazyInstance is completely thread safe, assuming that you create it safely. 25*6777b538SAndroid Build Coastguard Worker // The class was designed to be POD initialized, so it shouldn't require a 26*6777b538SAndroid Build Coastguard Worker // static constructor. It really only makes sense to declare a LazyInstance as 27*6777b538SAndroid Build Coastguard Worker // a global variable using the LAZY_INSTANCE_INITIALIZER initializer. 28*6777b538SAndroid Build Coastguard Worker // 29*6777b538SAndroid Build Coastguard Worker // LazyInstance is similar to Singleton, except it does not have the singleton 30*6777b538SAndroid Build Coastguard Worker // property. You can have multiple LazyInstance's of the same type, and each 31*6777b538SAndroid Build Coastguard Worker // will manage a unique instance. It also preallocates the space for Type, as 32*6777b538SAndroid Build Coastguard Worker // to avoid allocating the Type instance on the heap. This may help with the 33*6777b538SAndroid Build Coastguard Worker // performance of creating the instance, and reducing heap fragmentation. This 34*6777b538SAndroid Build Coastguard Worker // requires that Type be a complete type so we can determine the size. 35*6777b538SAndroid Build Coastguard Worker // 36*6777b538SAndroid Build Coastguard Worker // Example usage: 37*6777b538SAndroid Build Coastguard Worker // static LazyInstance<MyClass>::Leaky inst = LAZY_INSTANCE_INITIALIZER; 38*6777b538SAndroid Build Coastguard Worker // void SomeMethod() { 39*6777b538SAndroid Build Coastguard Worker // inst.Get().SomeMethod(); // MyClass::SomeMethod() 40*6777b538SAndroid Build Coastguard Worker // 41*6777b538SAndroid Build Coastguard Worker // MyClass* ptr = inst.Pointer(); 42*6777b538SAndroid Build Coastguard Worker // ptr->DoDoDo(); // MyClass::DoDoDo 43*6777b538SAndroid Build Coastguard Worker // } 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Worker #ifndef BASE_LAZY_INSTANCE_H_ 46*6777b538SAndroid Build Coastguard Worker #define BASE_LAZY_INSTANCE_H_ 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker #include <atomic> 49*6777b538SAndroid Build Coastguard Worker #include <new> // For placement new. 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker #include "base/check_op.h" 52*6777b538SAndroid Build Coastguard Worker #include "base/dcheck_is_on.h" 53*6777b538SAndroid Build Coastguard Worker #include "base/debug/leak_annotations.h" 54*6777b538SAndroid Build Coastguard Worker #include "base/lazy_instance_helpers.h" 55*6777b538SAndroid Build Coastguard Worker #include "base/threading/thread_restrictions.h" 56*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 57*6777b538SAndroid Build Coastguard Worker 58*6777b538SAndroid Build Coastguard Worker // LazyInstance uses its own struct initializer-list style static 59*6777b538SAndroid Build Coastguard Worker // initialization, which does not require a constructor. 60*6777b538SAndroid Build Coastguard Worker #define LAZY_INSTANCE_INITIALIZER {} 61*6777b538SAndroid Build Coastguard Worker 62*6777b538SAndroid Build Coastguard Worker namespace base { 63*6777b538SAndroid Build Coastguard Worker 64*6777b538SAndroid Build Coastguard Worker template <typename Type> 65*6777b538SAndroid Build Coastguard Worker struct LazyInstanceTraitsBase { NewLazyInstanceTraitsBase66*6777b538SAndroid Build Coastguard Worker static Type* New(void* instance) { 67*6777b538SAndroid Build Coastguard Worker DCHECK_EQ(reinterpret_cast<uintptr_t>(instance) & (alignof(Type) - 1), 0u); 68*6777b538SAndroid Build Coastguard Worker // Use placement new to initialize our instance in our preallocated space. 69*6777b538SAndroid Build Coastguard Worker // The parenthesis is very important here to force POD type initialization. 70*6777b538SAndroid Build Coastguard Worker return new (instance) Type(); 71*6777b538SAndroid Build Coastguard Worker } 72*6777b538SAndroid Build Coastguard Worker CallDestructorLazyInstanceTraitsBase73*6777b538SAndroid Build Coastguard Worker static void CallDestructor(Type* instance) { 74*6777b538SAndroid Build Coastguard Worker // Explicitly call the destructor. 75*6777b538SAndroid Build Coastguard Worker instance->~Type(); 76*6777b538SAndroid Build Coastguard Worker } 77*6777b538SAndroid Build Coastguard Worker }; 78*6777b538SAndroid Build Coastguard Worker 79*6777b538SAndroid Build Coastguard Worker // We pull out some of the functionality into non-templated functions, so we 80*6777b538SAndroid Build Coastguard Worker // can implement the more complicated pieces out of line in the .cc file. 81*6777b538SAndroid Build Coastguard Worker namespace internal { 82*6777b538SAndroid Build Coastguard Worker 83*6777b538SAndroid Build Coastguard Worker // This traits class causes destruction the contained Type at process exit via 84*6777b538SAndroid Build Coastguard Worker // AtExitManager. This is probably generally not what you want. Instead, prefer 85*6777b538SAndroid Build Coastguard Worker // Leaky below. 86*6777b538SAndroid Build Coastguard Worker template <typename Type> 87*6777b538SAndroid Build Coastguard Worker struct DestructorAtExitLazyInstanceTraits { 88*6777b538SAndroid Build Coastguard Worker static const bool kRegisterOnExit = true; 89*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON() 90*6777b538SAndroid Build Coastguard Worker static const bool kAllowedToAccessOnNonjoinableThread = false; 91*6777b538SAndroid Build Coastguard Worker #endif 92*6777b538SAndroid Build Coastguard Worker NewDestructorAtExitLazyInstanceTraits93*6777b538SAndroid Build Coastguard Worker static Type* New(void* instance) { 94*6777b538SAndroid Build Coastguard Worker return LazyInstanceTraitsBase<Type>::New(instance); 95*6777b538SAndroid Build Coastguard Worker } 96*6777b538SAndroid Build Coastguard Worker DeleteDestructorAtExitLazyInstanceTraits97*6777b538SAndroid Build Coastguard Worker static void Delete(Type* instance) { 98*6777b538SAndroid Build Coastguard Worker LazyInstanceTraitsBase<Type>::CallDestructor(instance); 99*6777b538SAndroid Build Coastguard Worker } 100*6777b538SAndroid Build Coastguard Worker }; 101*6777b538SAndroid Build Coastguard Worker 102*6777b538SAndroid Build Coastguard Worker // Use LazyInstance<T>::Leaky for a less-verbose call-site typedef; e.g.: 103*6777b538SAndroid Build Coastguard Worker // base::LazyInstance<T>::Leaky my_leaky_lazy_instance; 104*6777b538SAndroid Build Coastguard Worker // instead of: 105*6777b538SAndroid Build Coastguard Worker // base::LazyInstance<T, base::internal::LeakyLazyInstanceTraits<T> > 106*6777b538SAndroid Build Coastguard Worker // my_leaky_lazy_instance; 107*6777b538SAndroid Build Coastguard Worker // (especially when T is MyLongTypeNameImplClientHolderFactory). 108*6777b538SAndroid Build Coastguard Worker // Only use this internal::-qualified verbose form to extend this traits class 109*6777b538SAndroid Build Coastguard Worker // (depending on its implementation details). 110*6777b538SAndroid Build Coastguard Worker template <typename Type> 111*6777b538SAndroid Build Coastguard Worker struct LeakyLazyInstanceTraits { 112*6777b538SAndroid Build Coastguard Worker static const bool kRegisterOnExit = false; 113*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON() 114*6777b538SAndroid Build Coastguard Worker static const bool kAllowedToAccessOnNonjoinableThread = true; 115*6777b538SAndroid Build Coastguard Worker #endif 116*6777b538SAndroid Build Coastguard Worker NewLeakyLazyInstanceTraits117*6777b538SAndroid Build Coastguard Worker static Type* New(void* instance) { 118*6777b538SAndroid Build Coastguard Worker ANNOTATE_SCOPED_MEMORY_LEAK; 119*6777b538SAndroid Build Coastguard Worker return LazyInstanceTraitsBase<Type>::New(instance); 120*6777b538SAndroid Build Coastguard Worker } DeleteLeakyLazyInstanceTraits121*6777b538SAndroid Build Coastguard Worker static void Delete(Type* instance) { 122*6777b538SAndroid Build Coastguard Worker } 123*6777b538SAndroid Build Coastguard Worker }; 124*6777b538SAndroid Build Coastguard Worker 125*6777b538SAndroid Build Coastguard Worker template <typename Type> 126*6777b538SAndroid Build Coastguard Worker struct ErrorMustSelectLazyOrDestructorAtExitForLazyInstance {}; 127*6777b538SAndroid Build Coastguard Worker 128*6777b538SAndroid Build Coastguard Worker } // namespace internal 129*6777b538SAndroid Build Coastguard Worker 130*6777b538SAndroid Build Coastguard Worker template < 131*6777b538SAndroid Build Coastguard Worker typename Type, 132*6777b538SAndroid Build Coastguard Worker typename Traits = 133*6777b538SAndroid Build Coastguard Worker internal::ErrorMustSelectLazyOrDestructorAtExitForLazyInstance<Type>> 134*6777b538SAndroid Build Coastguard Worker class LazyInstance { 135*6777b538SAndroid Build Coastguard Worker public: 136*6777b538SAndroid Build Coastguard Worker // Do not define a destructor, as doing so makes LazyInstance a 137*6777b538SAndroid Build Coastguard Worker // non-POD-struct. We don't want that because then a static initializer will 138*6777b538SAndroid Build Coastguard Worker // be created to register the (empty) destructor with atexit() under MSVC, for 139*6777b538SAndroid Build Coastguard Worker // example. We handle destruction of the contained Type class explicitly via 140*6777b538SAndroid Build Coastguard Worker // the OnExit member function, where needed. 141*6777b538SAndroid Build Coastguard Worker // ~LazyInstance() {} 142*6777b538SAndroid Build Coastguard Worker 143*6777b538SAndroid Build Coastguard Worker // Convenience typedef to avoid having to repeat Type for leaky lazy 144*6777b538SAndroid Build Coastguard Worker // instances. 145*6777b538SAndroid Build Coastguard Worker typedef LazyInstance<Type, internal::LeakyLazyInstanceTraits<Type>> Leaky; 146*6777b538SAndroid Build Coastguard Worker typedef LazyInstance<Type, internal::DestructorAtExitLazyInstanceTraits<Type>> 147*6777b538SAndroid Build Coastguard Worker DestructorAtExit; 148*6777b538SAndroid Build Coastguard Worker Get()149*6777b538SAndroid Build Coastguard Worker Type& Get() { 150*6777b538SAndroid Build Coastguard Worker return *Pointer(); 151*6777b538SAndroid Build Coastguard Worker } 152*6777b538SAndroid Build Coastguard Worker Pointer()153*6777b538SAndroid Build Coastguard Worker Type* Pointer() { 154*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON() 155*6777b538SAndroid Build Coastguard Worker if (!Traits::kAllowedToAccessOnNonjoinableThread) 156*6777b538SAndroid Build Coastguard Worker internal::AssertSingletonAllowed(); 157*6777b538SAndroid Build Coastguard Worker #endif 158*6777b538SAndroid Build Coastguard Worker 159*6777b538SAndroid Build Coastguard Worker return subtle::GetOrCreateLazyPointer( 160*6777b538SAndroid Build Coastguard Worker private_instance_, &Traits::New, private_buf_, 161*6777b538SAndroid Build Coastguard Worker Traits::kRegisterOnExit ? OnExit : nullptr, this); 162*6777b538SAndroid Build Coastguard Worker } 163*6777b538SAndroid Build Coastguard Worker 164*6777b538SAndroid Build Coastguard Worker // Returns true if the lazy instance has been created. Unlike Get() and 165*6777b538SAndroid Build Coastguard Worker // Pointer(), calling IsCreated() will not instantiate the object of Type. IsCreated()166*6777b538SAndroid Build Coastguard Worker bool IsCreated() { 167*6777b538SAndroid Build Coastguard Worker // Return true (i.e. "created") if |private_instance_| is either being 168*6777b538SAndroid Build Coastguard Worker // created right now (i.e. |private_instance_| has value of 169*6777b538SAndroid Build Coastguard Worker // internal::kLazyInstanceStateCreating) or was already created (i.e. 170*6777b538SAndroid Build Coastguard Worker // |private_instance_| has any other non-zero value). 171*6777b538SAndroid Build Coastguard Worker return 0 != private_instance_.load(std::memory_order_relaxed); 172*6777b538SAndroid Build Coastguard Worker } 173*6777b538SAndroid Build Coastguard Worker 174*6777b538SAndroid Build Coastguard Worker // MSVC gives a warning that the alignment expands the size of the 175*6777b538SAndroid Build Coastguard Worker // LazyInstance struct to make the size a multiple of the alignment. This 176*6777b538SAndroid Build Coastguard Worker // is expected in this case. 177*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) 178*6777b538SAndroid Build Coastguard Worker #pragma warning(push) 179*6777b538SAndroid Build Coastguard Worker #pragma warning(disable : 4324) 180*6777b538SAndroid Build Coastguard Worker #endif 181*6777b538SAndroid Build Coastguard Worker 182*6777b538SAndroid Build Coastguard Worker // Effectively private: member data is only public to allow the linker to 183*6777b538SAndroid Build Coastguard Worker // statically initialize it and to maintain a POD class. DO NOT USE FROM 184*6777b538SAndroid Build Coastguard Worker // OUTSIDE THIS CLASS. 185*6777b538SAndroid Build Coastguard Worker std::atomic<uintptr_t> private_instance_; 186*6777b538SAndroid Build Coastguard Worker 187*6777b538SAndroid Build Coastguard Worker // Preallocated space for the Type instance. 188*6777b538SAndroid Build Coastguard Worker alignas(Type) char private_buf_[sizeof(Type)]; 189*6777b538SAndroid Build Coastguard Worker 190*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) 191*6777b538SAndroid Build Coastguard Worker #pragma warning(pop) 192*6777b538SAndroid Build Coastguard Worker #endif 193*6777b538SAndroid Build Coastguard Worker 194*6777b538SAndroid Build Coastguard Worker private: instance()195*6777b538SAndroid Build Coastguard Worker Type* instance() { 196*6777b538SAndroid Build Coastguard Worker return reinterpret_cast<Type*>( 197*6777b538SAndroid Build Coastguard Worker private_instance_.load(std::memory_order_relaxed)); 198*6777b538SAndroid Build Coastguard Worker } 199*6777b538SAndroid Build Coastguard Worker 200*6777b538SAndroid Build Coastguard Worker // Adapter function for use with AtExit. This should be called single 201*6777b538SAndroid Build Coastguard Worker // threaded, so don't synchronize across threads. 202*6777b538SAndroid Build Coastguard Worker // Calling OnExit while the instance is in use by other threads is a mistake. OnExit(void * lazy_instance)203*6777b538SAndroid Build Coastguard Worker static void OnExit(void* lazy_instance) { 204*6777b538SAndroid Build Coastguard Worker LazyInstance<Type, Traits>* me = 205*6777b538SAndroid Build Coastguard Worker reinterpret_cast<LazyInstance<Type, Traits>*>(lazy_instance); 206*6777b538SAndroid Build Coastguard Worker Traits::Delete(me->instance()); 207*6777b538SAndroid Build Coastguard Worker me->private_instance_.store(0, std::memory_order_relaxed); 208*6777b538SAndroid Build Coastguard Worker } 209*6777b538SAndroid Build Coastguard Worker }; 210*6777b538SAndroid Build Coastguard Worker 211*6777b538SAndroid Build Coastguard Worker } // namespace base 212*6777b538SAndroid Build Coastguard Worker 213*6777b538SAndroid Build Coastguard Worker #endif // BASE_LAZY_INSTANCE_H_ 214