xref: /aosp_15_r20/external/cronet/base/memory/singleton.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 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 // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
6*6777b538SAndroid Build Coastguard Worker // PLEASE READ: Do you really need a singleton? If possible, use a
7*6777b538SAndroid Build Coastguard Worker // function-local 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 // Singletons make it hard to determine the lifetime of an object, which can
16*6777b538SAndroid Build Coastguard Worker // lead to buggy code and spurious crashes.
17*6777b538SAndroid Build Coastguard Worker //
18*6777b538SAndroid Build Coastguard Worker // Instead of adding another singleton into the mix, try to identify either:
19*6777b538SAndroid Build Coastguard Worker //   a) An existing singleton that can manage your object's lifetime
20*6777b538SAndroid Build Coastguard Worker //   b) Locations where you can deterministically create the object and pass
21*6777b538SAndroid Build Coastguard Worker //      into other objects
22*6777b538SAndroid Build Coastguard Worker //
23*6777b538SAndroid Build Coastguard Worker // If you absolutely need a singleton, please keep them as trivial as possible
24*6777b538SAndroid Build Coastguard Worker // and ideally a leaf dependency. Singletons get problematic when they attempt
25*6777b538SAndroid Build Coastguard Worker // to do too much in their destructor or have circular dependencies.
26*6777b538SAndroid Build Coastguard Worker 
27*6777b538SAndroid Build Coastguard Worker #ifndef BASE_MEMORY_SINGLETON_H_
28*6777b538SAndroid Build Coastguard Worker #define BASE_MEMORY_SINGLETON_H_
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker #include <atomic>
31*6777b538SAndroid Build Coastguard Worker 
32*6777b538SAndroid Build Coastguard Worker #include "base/dcheck_is_on.h"
33*6777b538SAndroid Build Coastguard Worker #include "base/lazy_instance_helpers.h"
34*6777b538SAndroid Build Coastguard Worker #include "base/threading/thread_restrictions.h"
35*6777b538SAndroid Build Coastguard Worker 
36*6777b538SAndroid Build Coastguard Worker namespace base {
37*6777b538SAndroid Build Coastguard Worker 
38*6777b538SAndroid Build Coastguard Worker // Default traits for Singleton<Type>. Calls operator new and operator delete on
39*6777b538SAndroid Build Coastguard Worker // the object. Registers automatic deletion at process exit.
40*6777b538SAndroid Build Coastguard Worker // Overload if you need arguments or another memory allocation function.
41*6777b538SAndroid Build Coastguard Worker template<typename Type>
42*6777b538SAndroid Build Coastguard Worker struct DefaultSingletonTraits {
43*6777b538SAndroid Build Coastguard Worker   // Allocates the object.
NewDefaultSingletonTraits44*6777b538SAndroid Build Coastguard Worker   static Type* New() {
45*6777b538SAndroid Build Coastguard Worker     // The parenthesis is very important here; it forces POD type
46*6777b538SAndroid Build Coastguard Worker     // initialization.
47*6777b538SAndroid Build Coastguard Worker     return new Type();
48*6777b538SAndroid Build Coastguard Worker   }
49*6777b538SAndroid Build Coastguard Worker 
50*6777b538SAndroid Build Coastguard Worker   // Destroys the object.
DeleteDefaultSingletonTraits51*6777b538SAndroid Build Coastguard Worker   static void Delete(Type* x) {
52*6777b538SAndroid Build Coastguard Worker     delete x;
53*6777b538SAndroid Build Coastguard Worker   }
54*6777b538SAndroid Build Coastguard Worker 
55*6777b538SAndroid Build Coastguard Worker   // Set to true to automatically register deletion of the object on process
56*6777b538SAndroid Build Coastguard Worker   // exit. See below for the required call that makes this happen.
57*6777b538SAndroid Build Coastguard Worker   static const bool kRegisterAtExit = true;
58*6777b538SAndroid Build Coastguard Worker 
59*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
60*6777b538SAndroid Build Coastguard Worker   // Set to false to disallow access on a non-joinable thread.  This is
61*6777b538SAndroid Build Coastguard Worker   // different from kRegisterAtExit because StaticMemorySingletonTraits allows
62*6777b538SAndroid Build Coastguard Worker   // access on non-joinable threads, and gracefully handles this.
63*6777b538SAndroid Build Coastguard Worker   static const bool kAllowedToAccessOnNonjoinableThread = false;
64*6777b538SAndroid Build Coastguard Worker #endif
65*6777b538SAndroid Build Coastguard Worker };
66*6777b538SAndroid Build Coastguard Worker 
67*6777b538SAndroid Build Coastguard Worker 
68*6777b538SAndroid Build Coastguard Worker // Alternate traits for use with the Singleton<Type>.  Identical to
69*6777b538SAndroid Build Coastguard Worker // DefaultSingletonTraits except that the Singleton will not be cleaned up
70*6777b538SAndroid Build Coastguard Worker // at exit.
71*6777b538SAndroid Build Coastguard Worker template<typename Type>
72*6777b538SAndroid Build Coastguard Worker struct LeakySingletonTraits : public DefaultSingletonTraits<Type> {
73*6777b538SAndroid Build Coastguard Worker   static const bool kRegisterAtExit = false;
74*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
75*6777b538SAndroid Build Coastguard Worker   static const bool kAllowedToAccessOnNonjoinableThread = true;
76*6777b538SAndroid Build Coastguard Worker #endif
77*6777b538SAndroid Build Coastguard Worker };
78*6777b538SAndroid Build Coastguard Worker 
79*6777b538SAndroid Build Coastguard Worker // Alternate traits for use with the Singleton<Type>.  Allocates memory
80*6777b538SAndroid Build Coastguard Worker // for the singleton instance from a static buffer.  The singleton will
81*6777b538SAndroid Build Coastguard Worker // be cleaned up at exit, but can't be revived after destruction unless
82*6777b538SAndroid Build Coastguard Worker // the ResurrectForTesting() method is called.
83*6777b538SAndroid Build Coastguard Worker //
84*6777b538SAndroid Build Coastguard Worker // This is useful for a certain category of things, notably logging and
85*6777b538SAndroid Build Coastguard Worker // tracing, where the singleton instance is of a type carefully constructed to
86*6777b538SAndroid Build Coastguard Worker // be safe to access post-destruction.
87*6777b538SAndroid Build Coastguard Worker // In logging and tracing you'll typically get stray calls at odd times, like
88*6777b538SAndroid Build Coastguard Worker // during static destruction, thread teardown and the like, and there's a
89*6777b538SAndroid Build Coastguard Worker // termination race on the heap-based singleton - e.g. if one thread calls
90*6777b538SAndroid Build Coastguard Worker // get(), but then another thread initiates AtExit processing, the first thread
91*6777b538SAndroid Build Coastguard Worker // may call into an object residing in unallocated memory. If the instance is
92*6777b538SAndroid Build Coastguard Worker // allocated from the data segment, then this is survivable.
93*6777b538SAndroid Build Coastguard Worker //
94*6777b538SAndroid Build Coastguard Worker // The destructor is to deallocate system resources, in this case to unregister
95*6777b538SAndroid Build Coastguard Worker // a callback the system will invoke when logging levels change. Note that
96*6777b538SAndroid Build Coastguard Worker // this is also used in e.g. Chrome Frame, where you have to allow for the
97*6777b538SAndroid Build Coastguard Worker // possibility of loading briefly into someone else's process space, and
98*6777b538SAndroid Build Coastguard Worker // so leaking is not an option, as that would sabotage the state of your host
99*6777b538SAndroid Build Coastguard Worker // process once you've unloaded.
100*6777b538SAndroid Build Coastguard Worker template <typename Type>
101*6777b538SAndroid Build Coastguard Worker struct StaticMemorySingletonTraits {
102*6777b538SAndroid Build Coastguard Worker   // WARNING: User has to support a New() which returns null.
NewStaticMemorySingletonTraits103*6777b538SAndroid Build Coastguard Worker   static Type* New() {
104*6777b538SAndroid Build Coastguard Worker     // Only constructs once and returns pointer; otherwise returns null.
105*6777b538SAndroid Build Coastguard Worker     if (dead_.exchange(true, std::memory_order_relaxed))
106*6777b538SAndroid Build Coastguard Worker       return nullptr;
107*6777b538SAndroid Build Coastguard Worker 
108*6777b538SAndroid Build Coastguard Worker     return new (buffer_) Type();
109*6777b538SAndroid Build Coastguard Worker   }
110*6777b538SAndroid Build Coastguard Worker 
DeleteStaticMemorySingletonTraits111*6777b538SAndroid Build Coastguard Worker   static void Delete(Type* p) {
112*6777b538SAndroid Build Coastguard Worker     if (p)
113*6777b538SAndroid Build Coastguard Worker       p->Type::~Type();
114*6777b538SAndroid Build Coastguard Worker   }
115*6777b538SAndroid Build Coastguard Worker 
116*6777b538SAndroid Build Coastguard Worker   static const bool kRegisterAtExit = true;
117*6777b538SAndroid Build Coastguard Worker 
118*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
119*6777b538SAndroid Build Coastguard Worker   static const bool kAllowedToAccessOnNonjoinableThread = true;
120*6777b538SAndroid Build Coastguard Worker #endif
121*6777b538SAndroid Build Coastguard Worker 
ResurrectForTestingStaticMemorySingletonTraits122*6777b538SAndroid Build Coastguard Worker   static void ResurrectForTesting() {
123*6777b538SAndroid Build Coastguard Worker     dead_.store(false, std::memory_order_relaxed);
124*6777b538SAndroid Build Coastguard Worker   }
125*6777b538SAndroid Build Coastguard Worker 
126*6777b538SAndroid Build Coastguard Worker  private:
127*6777b538SAndroid Build Coastguard Worker   alignas(Type) static char buffer_[sizeof(Type)];
128*6777b538SAndroid Build Coastguard Worker   // Signal the object was already deleted, so it is not revived.
129*6777b538SAndroid Build Coastguard Worker   static std::atomic<bool> dead_;
130*6777b538SAndroid Build Coastguard Worker };
131*6777b538SAndroid Build Coastguard Worker 
132*6777b538SAndroid Build Coastguard Worker template <typename Type>
133*6777b538SAndroid Build Coastguard Worker alignas(Type) char StaticMemorySingletonTraits<Type>::buffer_[sizeof(Type)];
134*6777b538SAndroid Build Coastguard Worker template <typename Type>
135*6777b538SAndroid Build Coastguard Worker std::atomic<bool> StaticMemorySingletonTraits<Type>::dead_ = false;
136*6777b538SAndroid Build Coastguard Worker 
137*6777b538SAndroid Build Coastguard Worker // The Singleton<Type, Traits, DifferentiatingType> class manages a single
138*6777b538SAndroid Build Coastguard Worker // instance of Type which will be created on first use and will be destroyed at
139*6777b538SAndroid Build Coastguard Worker // normal process exit). The Trait::Delete function will not be called on
140*6777b538SAndroid Build Coastguard Worker // abnormal process exit.
141*6777b538SAndroid Build Coastguard Worker //
142*6777b538SAndroid Build Coastguard Worker // DifferentiatingType is used as a key to differentiate two different
143*6777b538SAndroid Build Coastguard Worker // singletons having the same memory allocation functions but serving a
144*6777b538SAndroid Build Coastguard Worker // different purpose. This is mainly used for Locks serving different purposes.
145*6777b538SAndroid Build Coastguard Worker //
146*6777b538SAndroid Build Coastguard Worker // Example usage:
147*6777b538SAndroid Build Coastguard Worker //
148*6777b538SAndroid Build Coastguard Worker // In your header:
149*6777b538SAndroid Build Coastguard Worker //   namespace base {
150*6777b538SAndroid Build Coastguard Worker //   template <typename T>
151*6777b538SAndroid Build Coastguard Worker //   struct DefaultSingletonTraits;
152*6777b538SAndroid Build Coastguard Worker //   }
153*6777b538SAndroid Build Coastguard Worker //   class FooClass {
154*6777b538SAndroid Build Coastguard Worker //    public:
155*6777b538SAndroid Build Coastguard Worker //     static FooClass* GetInstance();  <-- See comment below on this.
156*6777b538SAndroid Build Coastguard Worker //
157*6777b538SAndroid Build Coastguard Worker //     FooClass(const FooClass&) = delete;
158*6777b538SAndroid Build Coastguard Worker //     FooClass& operator=(const FooClass&) = delete;
159*6777b538SAndroid Build Coastguard Worker //
160*6777b538SAndroid Build Coastguard Worker //     void Bar() { ... }
161*6777b538SAndroid Build Coastguard Worker //
162*6777b538SAndroid Build Coastguard Worker //    private:
163*6777b538SAndroid Build Coastguard Worker //     FooClass() { ... }
164*6777b538SAndroid Build Coastguard Worker //     friend struct base::DefaultSingletonTraits<FooClass>;
165*6777b538SAndroid Build Coastguard Worker //   };
166*6777b538SAndroid Build Coastguard Worker //
167*6777b538SAndroid Build Coastguard Worker // In your source file:
168*6777b538SAndroid Build Coastguard Worker //  #include "base/memory/singleton.h"
169*6777b538SAndroid Build Coastguard Worker //  FooClass* FooClass::GetInstance() {
170*6777b538SAndroid Build Coastguard Worker //    return base::Singleton<FooClass>::get();
171*6777b538SAndroid Build Coastguard Worker //  }
172*6777b538SAndroid Build Coastguard Worker //
173*6777b538SAndroid Build Coastguard Worker // Or for leaky singletons:
174*6777b538SAndroid Build Coastguard Worker //  #include "base/memory/singleton.h"
175*6777b538SAndroid Build Coastguard Worker //  FooClass* FooClass::GetInstance() {
176*6777b538SAndroid Build Coastguard Worker //    return base::Singleton<
177*6777b538SAndroid Build Coastguard Worker //        FooClass, base::LeakySingletonTraits<FooClass>>::get();
178*6777b538SAndroid Build Coastguard Worker //  }
179*6777b538SAndroid Build Coastguard Worker //
180*6777b538SAndroid Build Coastguard Worker // And to call methods on FooClass:
181*6777b538SAndroid Build Coastguard Worker //   FooClass::GetInstance()->Bar();
182*6777b538SAndroid Build Coastguard Worker //
183*6777b538SAndroid Build Coastguard Worker // NOTE: The method accessing Singleton<T>::get() has to be named as GetInstance
184*6777b538SAndroid Build Coastguard Worker // and it is important that FooClass::GetInstance() is not inlined in the
185*6777b538SAndroid Build Coastguard Worker // header. This makes sure that when source files from multiple targets include
186*6777b538SAndroid Build Coastguard Worker // this header they don't end up with different copies of the inlined code
187*6777b538SAndroid Build Coastguard Worker // creating multiple copies of the singleton.
188*6777b538SAndroid Build Coastguard Worker //
189*6777b538SAndroid Build Coastguard Worker // Singleton<> has no non-static members and doesn't need to actually be
190*6777b538SAndroid Build Coastguard Worker // instantiated.
191*6777b538SAndroid Build Coastguard Worker //
192*6777b538SAndroid Build Coastguard Worker // This class is itself thread-safe. The underlying Type must of course be
193*6777b538SAndroid Build Coastguard Worker // thread-safe if you want to use it concurrently. Two parameters may be tuned
194*6777b538SAndroid Build Coastguard Worker // depending on the user's requirements.
195*6777b538SAndroid Build Coastguard Worker //
196*6777b538SAndroid Build Coastguard Worker // Glossary:
197*6777b538SAndroid Build Coastguard Worker //   RAE = kRegisterAtExit
198*6777b538SAndroid Build Coastguard Worker //
199*6777b538SAndroid Build Coastguard Worker // On every platform, if Traits::RAE is true, the singleton will be destroyed at
200*6777b538SAndroid Build Coastguard Worker // process exit. More precisely it uses AtExitManager which requires an
201*6777b538SAndroid Build Coastguard Worker // object of this type to be instantiated. AtExitManager mimics the semantics
202*6777b538SAndroid Build Coastguard Worker // of atexit() such as LIFO order but under Windows is safer to call. For more
203*6777b538SAndroid Build Coastguard Worker // information see at_exit.h.
204*6777b538SAndroid Build Coastguard Worker //
205*6777b538SAndroid Build Coastguard Worker // If Traits::RAE is false, the singleton will not be freed at process exit,
206*6777b538SAndroid Build Coastguard Worker // thus the singleton will be leaked if it is ever accessed. Traits::RAE
207*6777b538SAndroid Build Coastguard Worker // shouldn't be false unless absolutely necessary. Remember that the heap where
208*6777b538SAndroid Build Coastguard Worker // the object is allocated may be destroyed by the CRT anyway.
209*6777b538SAndroid Build Coastguard Worker //
210*6777b538SAndroid Build Coastguard Worker // Caveats:
211*6777b538SAndroid Build Coastguard Worker // (a) Every call to get(), operator->() and operator*() incurs some overhead
212*6777b538SAndroid Build Coastguard Worker //     (16ns on my P4/2.8GHz) to check whether the object has already been
213*6777b538SAndroid Build Coastguard Worker //     initialized.  You may wish to cache the result of get(); it will not
214*6777b538SAndroid Build Coastguard Worker //     change.
215*6777b538SAndroid Build Coastguard Worker //
216*6777b538SAndroid Build Coastguard Worker // (b) Your factory function must never throw an exception. This class is not
217*6777b538SAndroid Build Coastguard Worker //     exception-safe.
218*6777b538SAndroid Build Coastguard Worker //
219*6777b538SAndroid Build Coastguard Worker 
220*6777b538SAndroid Build Coastguard Worker template <typename Type,
221*6777b538SAndroid Build Coastguard Worker           typename Traits = DefaultSingletonTraits<Type>,
222*6777b538SAndroid Build Coastguard Worker           typename DifferentiatingType = Type>
223*6777b538SAndroid Build Coastguard Worker class Singleton {
224*6777b538SAndroid Build Coastguard Worker  private:
225*6777b538SAndroid Build Coastguard Worker   // A class T using the Singleton<T> pattern should declare a GetInstance()
226*6777b538SAndroid Build Coastguard Worker   // method and call Singleton::get() from within that. T may also declare a
227*6777b538SAndroid Build Coastguard Worker   // GetInstanceIfExists() method to invoke Singleton::GetIfExists().
228*6777b538SAndroid Build Coastguard Worker   friend Type;
229*6777b538SAndroid Build Coastguard Worker 
230*6777b538SAndroid Build Coastguard Worker   // This class is safe to be constructed and copy-constructed since it has no
231*6777b538SAndroid Build Coastguard Worker   // member.
232*6777b538SAndroid Build Coastguard Worker 
233*6777b538SAndroid Build Coastguard Worker   // Returns a pointer to the one true instance of the class.
get()234*6777b538SAndroid Build Coastguard Worker   static Type* get() {
235*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
236*6777b538SAndroid Build Coastguard Worker     if (!Traits::kAllowedToAccessOnNonjoinableThread)
237*6777b538SAndroid Build Coastguard Worker       internal::AssertSingletonAllowed();
238*6777b538SAndroid Build Coastguard Worker #endif
239*6777b538SAndroid Build Coastguard Worker 
240*6777b538SAndroid Build Coastguard Worker     return subtle::GetOrCreateLazyPointer(
241*6777b538SAndroid Build Coastguard Worker         instance_, &CreatorFunc, nullptr,
242*6777b538SAndroid Build Coastguard Worker         Traits::kRegisterAtExit ? OnExit : nullptr, nullptr);
243*6777b538SAndroid Build Coastguard Worker   }
244*6777b538SAndroid Build Coastguard Worker 
245*6777b538SAndroid Build Coastguard Worker   // Returns the same result as get() if the instance exists but doesn't
246*6777b538SAndroid Build Coastguard Worker   // construct it (and returns null) if it doesn't.
GetIfExists()247*6777b538SAndroid Build Coastguard Worker   static Type* GetIfExists() {
248*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
249*6777b538SAndroid Build Coastguard Worker     if (!Traits::kAllowedToAccessOnNonjoinableThread)
250*6777b538SAndroid Build Coastguard Worker       internal::AssertSingletonAllowed();
251*6777b538SAndroid Build Coastguard Worker #endif
252*6777b538SAndroid Build Coastguard Worker 
253*6777b538SAndroid Build Coastguard Worker     if (!instance_.load(std::memory_order_relaxed))
254*6777b538SAndroid Build Coastguard Worker       return nullptr;
255*6777b538SAndroid Build Coastguard Worker 
256*6777b538SAndroid Build Coastguard Worker     // Need to invoke get() nonetheless as some Traits return null after
257*6777b538SAndroid Build Coastguard Worker     // destruction (even though |instance_| still holds garbage).
258*6777b538SAndroid Build Coastguard Worker     return get();
259*6777b538SAndroid Build Coastguard Worker   }
260*6777b538SAndroid Build Coastguard Worker 
261*6777b538SAndroid Build Coastguard Worker   // Internal method used as an adaptor for GetOrCreateLazyPointer(). Do not use
262*6777b538SAndroid Build Coastguard Worker   // outside of that use case.
CreatorFunc(void *)263*6777b538SAndroid Build Coastguard Worker   static Type* CreatorFunc(void* /* creator_arg*/) { return Traits::New(); }
264*6777b538SAndroid Build Coastguard Worker 
265*6777b538SAndroid Build Coastguard Worker   // Adapter function for use with AtExit().  This should be called single
266*6777b538SAndroid Build Coastguard Worker   // threaded, so don't use atomic operations.
267*6777b538SAndroid Build Coastguard Worker   // Calling OnExit while singleton is in use by other threads is a mistake.
OnExit(void *)268*6777b538SAndroid Build Coastguard Worker   static void OnExit(void* /*unused*/) {
269*6777b538SAndroid Build Coastguard Worker     // AtExit should only ever be register after the singleton instance was
270*6777b538SAndroid Build Coastguard Worker     // created.  We should only ever get here with a valid instance_ pointer.
271*6777b538SAndroid Build Coastguard Worker     Traits::Delete(
272*6777b538SAndroid Build Coastguard Worker         reinterpret_cast<Type*>(instance_.load(std::memory_order_relaxed)));
273*6777b538SAndroid Build Coastguard Worker     instance_.store(0, std::memory_order_relaxed);
274*6777b538SAndroid Build Coastguard Worker   }
275*6777b538SAndroid Build Coastguard Worker   static std::atomic<uintptr_t> instance_;
276*6777b538SAndroid Build Coastguard Worker };
277*6777b538SAndroid Build Coastguard Worker 
278*6777b538SAndroid Build Coastguard Worker template <typename Type, typename Traits, typename DifferentiatingType>
279*6777b538SAndroid Build Coastguard Worker std::atomic<uintptr_t> Singleton<Type, Traits, DifferentiatingType>::instance_ =
280*6777b538SAndroid Build Coastguard Worker     0;
281*6777b538SAndroid Build Coastguard Worker 
282*6777b538SAndroid Build Coastguard Worker }  // namespace base
283*6777b538SAndroid Build Coastguard Worker 
284*6777b538SAndroid Build Coastguard Worker #endif  // BASE_MEMORY_SINGLETON_H_
285