Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(78)

Side by Side Diff: base/lazy_instance.h

Issue 10796020: Upgrade AlignedMemory to support dynamic allocations. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Comments. Remove unused imports. Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // The LazyInstance<Type, Traits> class manages a single instance of Type, 5 // The LazyInstance<Type, Traits> class manages a single instance of Type,
6 // which will be lazily created on the first time it's accessed. This class is 6 // which will be lazily created on the first time it's accessed. This class is
7 // useful for places you would normally use a function-level static, but you 7 // useful for places you would normally use a function-level static, but you
8 // need to have guaranteed thread-safety. The Type constructor will only ever 8 // need to have guaranteed thread-safety. The Type constructor will only ever
9 // be called once, even if two threads are racing to create the object. Get() 9 // be called once, even if two threads are racing to create the object. Get()
10 // and Pointer() will always return the same, completely initialized instance. 10 // and Pointer() will always return the same, completely initialized instance.
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 return p == instance(); 180 return p == instance();
181 } 181 }
182 } 182 }
183 183
184 // Effectively private: member data is only public to allow the linker to 184 // Effectively private: member data is only public to allow the linker to
185 // statically initialize it and to maintain a POD class. DO NOT USE FROM 185 // statically initialize it and to maintain a POD class. DO NOT USE FROM
186 // OUTSIDE THIS CLASS. 186 // OUTSIDE THIS CLASS.
187 187
188 subtle::AtomicWord private_instance_; 188 subtle::AtomicWord private_instance_;
189 // Preallocated space for the Type instance. 189 // Preallocated space for the Type instance.
190 base::AlignedMemory<sizeof(Type), ALIGNOF(Type)> private_buf_; 190 base::AlignedMemory<ALIGNOF(Type), sizeof(Type)> private_buf_;
191 191
192 private: 192 private:
193 Type* instance() { 193 Type* instance() {
194 return reinterpret_cast<Type*>(subtle::NoBarrier_Load(&private_instance_)); 194 return reinterpret_cast<Type*>(subtle::NoBarrier_Load(&private_instance_));
195 } 195 }
196 196
197 // Adapter function for use with AtExit. This should be called single 197 // Adapter function for use with AtExit. This should be called single
198 // threaded, so don't synchronize across threads. 198 // threaded, so don't synchronize across threads.
199 // Calling OnExit while the instance is in use by other threads is a mistake. 199 // Calling OnExit while the instance is in use by other threads is a mistake.
200 static void OnExit(void* lazy_instance) { 200 static void OnExit(void* lazy_instance) {
201 LazyInstance<Type, Traits>* me = 201 LazyInstance<Type, Traits>* me =
202 reinterpret_cast<LazyInstance<Type, Traits>*>(lazy_instance); 202 reinterpret_cast<LazyInstance<Type, Traits>*>(lazy_instance);
203 Traits::Delete(me->instance()); 203 Traits::Delete(me->instance());
204 subtle::NoBarrier_Store(&me->private_instance_, 0); 204 subtle::NoBarrier_Store(&me->private_instance_, 0);
205 } 205 }
206 }; 206 };
207 207
208 } // namespace base 208 } // namespace base
209 209
210 #endif // BASE_LAZY_INSTANCE_H_ 210 #endif // BASE_LAZY_INSTANCE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698