| Index: base/threading/thread_local_storage.cc
|
| diff --git a/base/threading/thread_local_storage.cc b/base/threading/thread_local_storage.cc
|
| index 15a1d5e2dbb498ea0c7b18f294b1805a7bbfe8dd..198a308a659de9708576001ef29b96c13380fce6 100644
|
| --- a/base/threading/thread_local_storage.cc
|
| +++ b/base/threading/thread_local_storage.cc
|
| @@ -5,7 +5,6 @@
|
| #include "base/threading/thread_local_storage.h"
|
|
|
| #include "base/atomicops.h"
|
| -#include "base/lazy_instance.h"
|
| #include "base/logging.h"
|
| #include "base/synchronization/lock.h"
|
| #include "build/build_config.h"
|
| @@ -90,9 +89,12 @@ struct TlsVectorEntry {
|
| uint32_t version;
|
| };
|
|
|
| -// This LazyInstance isn't needed until after we've constructed the per-thread
|
| -// TLS vector, so it's safe to use.
|
| -base::LazyInstance<base::Lock>::Leaky g_tls_metadata_lock;
|
| +// This lock isn't needed until after we've constructed the per-thread TLS
|
| +// vector, so it's safe to use.
|
| +base::Lock* GetTLSMetadataLock() {
|
| + static auto lock = new base::Lock();
|
| + return lock;
|
| +}
|
| TlsMetadata g_tls_metadata[kThreadLocalStorageSize];
|
| size_t g_last_assigned_slot = 0;
|
|
|
| @@ -182,7 +184,7 @@ void OnThreadExitInternal(TlsVectorEntry* tls_data) {
|
| // Snapshot the TLS Metadata so we don't have to lock on every access.
|
| TlsMetadata tls_metadata[kThreadLocalStorageSize];
|
| {
|
| - base::AutoLock auto_lock(g_tls_metadata_lock.Get());
|
| + base::AutoLock auto_lock(*GetTLSMetadataLock());
|
| memcpy(tls_metadata, g_tls_metadata, sizeof(g_tls_metadata));
|
| }
|
|
|
| @@ -261,7 +263,7 @@ void ThreadLocalStorage::StaticSlot::Initialize(TLSDestructorFunc destructor) {
|
| slot_ = kInvalidSlotValue;
|
| version_ = 0;
|
| {
|
| - base::AutoLock auto_lock(g_tls_metadata_lock.Get());
|
| + base::AutoLock auto_lock(*GetTLSMetadataLock());
|
| for (int i = 0; i < kThreadLocalStorageSize; ++i) {
|
| // Tracking the last assigned slot is an attempt to find the next
|
| // available slot within one iteration. Under normal usage, slots remain
|
| @@ -291,7 +293,7 @@ void ThreadLocalStorage::StaticSlot::Free() {
|
| DCHECK_NE(slot_, kInvalidSlotValue);
|
| DCHECK_LT(slot_, kThreadLocalStorageSize);
|
| {
|
| - base::AutoLock auto_lock(g_tls_metadata_lock.Get());
|
| + base::AutoLock auto_lock(*GetTLSMetadataLock());
|
| g_tls_metadata[slot_].status = TlsStatus::FREE;
|
| g_tls_metadata[slot_].destructor = nullptr;
|
| ++(g_tls_metadata[slot_].version);
|
|
|