OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2008 Apple Inc. All rights reserved. |
3 * Copyright (C) 2009 Jian Li <jianli@chromium.org> | 3 * Copyright (C) 2009 Jian Li <jianli@chromium.org> |
4 * Copyright (C) 2012 Patrick Gansterer <paroga@paroga.com> | 4 * Copyright (C) 2012 Patrick Gansterer <paroga@paroga.com> |
5 * | 5 * |
6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
8 * are met: | 8 * are met: |
9 * | 9 * |
10 * 1. Redistributions of source code must retain the above copyright | 10 * 1. Redistributions of source code must retain the above copyright |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 }; | 119 }; |
120 | 120 |
121 #if OS(POSIX) | 121 #if OS(POSIX) |
122 | 122 |
123 typedef pthread_key_t ThreadSpecificKey; | 123 typedef pthread_key_t ThreadSpecificKey; |
124 | 124 |
125 inline void ThreadSpecificKeyCreate(ThreadSpecificKey* key, | 125 inline void ThreadSpecificKeyCreate(ThreadSpecificKey* key, |
126 void (*destructor)(void*)) { | 126 void (*destructor)(void*)) { |
127 int error = pthread_key_create(key, destructor); | 127 int error = pthread_key_create(key, destructor); |
128 if (error) | 128 if (error) |
129 CRASH(); | 129 IMMEDIATE_CRASH(); |
130 } | 130 } |
131 | 131 |
132 inline void ThreadSpecificKeyDelete(ThreadSpecificKey key) { | 132 inline void ThreadSpecificKeyDelete(ThreadSpecificKey key) { |
133 int error = pthread_key_delete(key); | 133 int error = pthread_key_delete(key); |
134 if (error) | 134 if (error) |
135 CRASH(); | 135 IMMEDIATE_CRASH(); |
136 } | 136 } |
137 | 137 |
138 inline void ThreadSpecificSet(ThreadSpecificKey key, void* value) { | 138 inline void ThreadSpecificSet(ThreadSpecificKey key, void* value) { |
139 pthread_setspecific(key, value); | 139 pthread_setspecific(key, value); |
140 } | 140 } |
141 | 141 |
142 inline void* ThreadSpecificGet(ThreadSpecificKey key) { | 142 inline void* ThreadSpecificGet(ThreadSpecificKey key) { |
143 return pthread_getspecific(key); | 143 return pthread_getspecific(key); |
144 } | 144 } |
145 | 145 |
146 template <typename T> | 146 template <typename T> |
147 inline ThreadSpecific<T>::ThreadSpecific() { | 147 inline ThreadSpecific<T>::ThreadSpecific() { |
148 int error = pthread_key_create(&key_, Destroy); | 148 int error = pthread_key_create(&key_, Destroy); |
149 if (error) | 149 if (error) |
150 CRASH(); | 150 IMMEDIATE_CRASH(); |
151 } | 151 } |
152 | 152 |
153 template <typename T> | 153 template <typename T> |
154 inline T* ThreadSpecific<T>::Get() { | 154 inline T* ThreadSpecific<T>::Get() { |
155 Data* data = static_cast<Data*>(pthread_getspecific(key_)); | 155 Data* data = static_cast<Data*>(pthread_getspecific(key_)); |
156 return data ? data->value : 0; | 156 return data ? data->value : 0; |
157 } | 157 } |
158 | 158 |
159 template <typename T> | 159 template <typename T> |
160 inline void ThreadSpecific<T>::Set(T* ptr) { | 160 inline void ThreadSpecific<T>::Set(T* ptr) { |
(...skipping 24 matching lines...) Expand all Loading... |
185 | 185 |
186 WTF_EXPORT void ThreadSpecificKeyCreate(ThreadSpecificKey*, void (*)(void*)); | 186 WTF_EXPORT void ThreadSpecificKeyCreate(ThreadSpecificKey*, void (*)(void*)); |
187 WTF_EXPORT void ThreadSpecificKeyDelete(ThreadSpecificKey); | 187 WTF_EXPORT void ThreadSpecificKeyDelete(ThreadSpecificKey); |
188 WTF_EXPORT void ThreadSpecificSet(ThreadSpecificKey, void*); | 188 WTF_EXPORT void ThreadSpecificSet(ThreadSpecificKey, void*); |
189 WTF_EXPORT void* ThreadSpecificGet(ThreadSpecificKey); | 189 WTF_EXPORT void* ThreadSpecificGet(ThreadSpecificKey); |
190 | 190 |
191 template <typename T> | 191 template <typename T> |
192 inline ThreadSpecific<T>::ThreadSpecific() : index_(-1) { | 192 inline ThreadSpecific<T>::ThreadSpecific() : index_(-1) { |
193 DWORD tls_key = TlsAlloc(); | 193 DWORD tls_key = TlsAlloc(); |
194 if (tls_key == TLS_OUT_OF_INDEXES) | 194 if (tls_key == TLS_OUT_OF_INDEXES) |
195 CRASH(); | 195 IMMEDIATE_CRASH(); |
196 | 196 |
197 index_ = InterlockedIncrement(&TlsKeyCount()) - 1; | 197 index_ = InterlockedIncrement(&TlsKeyCount()) - 1; |
198 if (index_ >= kMaxTlsKeySize) | 198 if (index_ >= kMaxTlsKeySize) |
199 CRASH(); | 199 IMMEDIATE_CRASH(); |
200 TlsKeys()[index_] = tls_key; | 200 TlsKeys()[index_] = tls_key; |
201 } | 201 } |
202 | 202 |
203 template <typename T> | 203 template <typename T> |
204 inline ThreadSpecific<T>::~ThreadSpecific() { | 204 inline ThreadSpecific<T>::~ThreadSpecific() { |
205 // Does not invoke destructor functions. They will be called from | 205 // Does not invoke destructor functions. They will be called from |
206 // ThreadSpecificThreadExit when the thread is detached. | 206 // ThreadSpecificThreadExit when the thread is detached. |
207 TlsFree(tlsKeys()[m_index]); | 207 TlsFree(tlsKeys()[m_index]); |
208 } | 208 } |
209 | 209 |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
307 template <typename T> | 307 template <typename T> |
308 inline T& ThreadSpecific<T>::operator*() { | 308 inline T& ThreadSpecific<T>::operator*() { |
309 return *operator T*(); | 309 return *operator T*(); |
310 } | 310 } |
311 | 311 |
312 } // namespace WTF | 312 } // namespace WTF |
313 | 313 |
314 using WTF::ThreadSpecific; | 314 using WTF::ThreadSpecific; |
315 | 315 |
316 #endif // WTF_ThreadSpecific_h | 316 #endif // WTF_ThreadSpecific_h |
OLD | NEW |