| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 #include "base/threading/thread_local_storage.h" | 5 #include "base/threading/thread_local_storage.h" |
| 6 | 6 |
| 7 #include <windows.h> | 7 #include <windows.h> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 | 10 |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 79 // Ensure that any rentrant calls change the temp version. | 79 // Ensure that any rentrant calls change the temp version. |
| 80 TlsSetValue(tls_key_, stack_allocated_tls_data); | 80 TlsSetValue(tls_key_, stack_allocated_tls_data); |
| 81 | 81 |
| 82 // Allocate an array to store our data. | 82 // Allocate an array to store our data. |
| 83 void** tls_data = new void*[kThreadLocalStorageSize]; | 83 void** tls_data = new void*[kThreadLocalStorageSize]; |
| 84 memcpy(tls_data, stack_allocated_tls_data, sizeof(stack_allocated_tls_data)); | 84 memcpy(tls_data, stack_allocated_tls_data, sizeof(stack_allocated_tls_data)); |
| 85 TlsSetValue(tls_key_, tls_data); | 85 TlsSetValue(tls_key_, tls_data); |
| 86 return tls_data; | 86 return tls_data; |
| 87 } | 87 } |
| 88 | 88 |
| 89 ThreadLocalStorage::Slot::Slot(TLSDestructorFunc destructor) | 89 ThreadLocalStorage::Slot::Slot(TLSDestructorFunc destructor) { |
| 90 : initialized_(false), | 90 initialized_ = false; |
| 91 slot_(0) { | 91 slot_ = 0; |
| 92 Initialize(destructor); | 92 Initialize(destructor); |
| 93 } | 93 } |
| 94 | 94 |
| 95 bool ThreadLocalStorage::Slot::Initialize(TLSDestructorFunc destructor) { | 95 bool ThreadLocalStorage::StaticSlot::Initialize(TLSDestructorFunc destructor) { |
| 96 if (tls_key_ == TLS_OUT_OF_INDEXES || !TlsGetValue(tls_key_)) | 96 if (tls_key_ == TLS_OUT_OF_INDEXES || !TlsGetValue(tls_key_)) |
| 97 ThreadLocalStorage::Initialize(); | 97 ThreadLocalStorage::Initialize(); |
| 98 | 98 |
| 99 // Grab a new slot. | 99 // Grab a new slot. |
| 100 slot_ = InterlockedIncrement(&tls_max_) - 1; | 100 slot_ = InterlockedIncrement(&tls_max_) - 1; |
| 101 DCHECK_GT(slot_, 0); | 101 DCHECK_GT(slot_, 0); |
| 102 if (slot_ >= kThreadLocalStorageSize) { | 102 if (slot_ >= kThreadLocalStorageSize) { |
| 103 NOTREACHED(); | 103 NOTREACHED(); |
| 104 return false; | 104 return false; |
| 105 } | 105 } |
| 106 | 106 |
| 107 // Setup our destructor. | 107 // Setup our destructor. |
| 108 g_tls_destructors[slot_] = destructor; | 108 g_tls_destructors[slot_] = destructor; |
| 109 initialized_ = true; | 109 initialized_ = true; |
| 110 return true; | 110 return true; |
| 111 } | 111 } |
| 112 | 112 |
| 113 void ThreadLocalStorage::Slot::Free() { | 113 void ThreadLocalStorage::StaticSlot::Free() { |
| 114 // At this time, we don't reclaim old indices for TLS slots. | 114 // At this time, we don't reclaim old indices for TLS slots. |
| 115 // So all we need to do is wipe the destructor. | 115 // So all we need to do is wipe the destructor. |
| 116 DCHECK_GT(slot_, 0); | 116 DCHECK_GT(slot_, 0); |
| 117 DCHECK_LT(slot_, kThreadLocalStorageSize); | 117 DCHECK_LT(slot_, kThreadLocalStorageSize); |
| 118 g_tls_destructors[slot_] = NULL; | 118 g_tls_destructors[slot_] = NULL; |
| 119 slot_ = 0; | 119 slot_ = 0; |
| 120 initialized_ = false; | 120 initialized_ = false; |
| 121 } | 121 } |
| 122 | 122 |
| 123 void* ThreadLocalStorage::Slot::Get() const { | 123 void* ThreadLocalStorage::StaticSlot::Get() const { |
| 124 void** tls_data = static_cast<void**>(TlsGetValue(tls_key_)); | 124 void** tls_data = static_cast<void**>(TlsGetValue(tls_key_)); |
| 125 if (!tls_data) | 125 if (!tls_data) |
| 126 tls_data = ThreadLocalStorage::Initialize(); | 126 tls_data = ThreadLocalStorage::Initialize(); |
| 127 DCHECK_GT(slot_, 0); | 127 DCHECK_GT(slot_, 0); |
| 128 DCHECK_LT(slot_, kThreadLocalStorageSize); | 128 DCHECK_LT(slot_, kThreadLocalStorageSize); |
| 129 return tls_data[slot_]; | 129 return tls_data[slot_]; |
| 130 } | 130 } |
| 131 | 131 |
| 132 void ThreadLocalStorage::Slot::Set(void* value) { | 132 void ThreadLocalStorage::StaticSlot::Set(void* value) { |
| 133 void** tls_data = static_cast<void**>(TlsGetValue(tls_key_)); | 133 void** tls_data = static_cast<void**>(TlsGetValue(tls_key_)); |
| 134 if (!tls_data) | 134 if (!tls_data) |
| 135 tls_data = ThreadLocalStorage::Initialize(); | 135 tls_data = ThreadLocalStorage::Initialize(); |
| 136 DCHECK_GT(slot_, 0); | 136 DCHECK_GT(slot_, 0); |
| 137 DCHECK_LT(slot_, kThreadLocalStorageSize); | 137 DCHECK_LT(slot_, kThreadLocalStorageSize); |
| 138 tls_data[slot_] = value; | 138 tls_data[slot_] = value; |
| 139 } | 139 } |
| 140 | 140 |
| 141 void ThreadLocalStorage::ThreadExit() { | 141 void ThreadLocalStorage::ThreadExit() { |
| 142 if (tls_key_ == TLS_OUT_OF_INDEXES) | 142 if (tls_key_ == TLS_OUT_OF_INDEXES) |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 261 #else // _WIN64 | 261 #else // _WIN64 |
| 262 | 262 |
| 263 #pragma data_seg(".CRT$XLB") | 263 #pragma data_seg(".CRT$XLB") |
| 264 PIMAGE_TLS_CALLBACK p_thread_callback_base = OnThreadExit; | 264 PIMAGE_TLS_CALLBACK p_thread_callback_base = OnThreadExit; |
| 265 | 265 |
| 266 // Reset the default section. | 266 // Reset the default section. |
| 267 #pragma data_seg() | 267 #pragma data_seg() |
| 268 | 268 |
| 269 #endif // _WIN64 | 269 #endif // _WIN64 |
| 270 } // extern "C" | 270 } // extern "C" |
| OLD | NEW |