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 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
66 WTF_EXPORT void ThreadSpecificThreadExit(); | 66 WTF_EXPORT void ThreadSpecificThreadExit(); |
67 #endif | 67 #endif |
68 | 68 |
69 template <typename T> | 69 template <typename T> |
70 class ThreadSpecific { | 70 class ThreadSpecific { |
71 USING_FAST_MALLOC(ThreadSpecific); | 71 USING_FAST_MALLOC(ThreadSpecific); |
72 WTF_MAKE_NONCOPYABLE(ThreadSpecific); | 72 WTF_MAKE_NONCOPYABLE(ThreadSpecific); |
73 | 73 |
74 public: | 74 public: |
75 ThreadSpecific(); | 75 ThreadSpecific(); |
76 bool | 76 |
77 isSet(); // Useful as a fast check to see if this thread has set this value. | 77 // Useful as a fast check to see if this thread has set this value. |
78 bool isSet(); | |
79 | |
80 // Must only be called during thread initialization. | |
81 void initializeOnOffThread(); | |
esprehn
2017/01/19 23:47:45
OnOffThread is weirdly named, did this lose a word
Charlie Harrison
2017/01/19 23:54:41
Nope, I'm just awkward at naming things :P
| |
82 void initializeOnMainThread(); | |
78 T* operator->(); | 83 T* operator->(); |
79 operator T*(); | 84 operator T*(); |
80 T& operator*(); | 85 T& operator*(); |
81 | 86 |
82 private: | 87 private: |
83 #if OS(WIN) | 88 #if OS(WIN) |
84 WTF_EXPORT friend void ThreadSpecificThreadExit(); | 89 WTF_EXPORT friend void ThreadSpecificThreadExit(); |
85 #endif | 90 #endif |
86 | 91 |
87 // Not implemented. It's technically possible to destroy a thread specific | 92 // Not implemented. It's technically possible to destroy a thread specific |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
233 // We want get() to keep working while data destructor works, because it can | 238 // We want get() to keep working while data destructor works, because it can |
234 // be called indirectly by the destructor. Some pthreads implementations | 239 // be called indirectly by the destructor. Some pthreads implementations |
235 // zero out the pointer before calling destroy(), so we temporarily reset it. | 240 // zero out the pointer before calling destroy(), so we temporarily reset it. |
236 pthread_setspecific(data->owner->m_key, ptr); | 241 pthread_setspecific(data->owner->m_key, ptr); |
237 #endif | 242 #endif |
238 | 243 |
239 // Never call destructors on the main thread. This is fine because Blink no | 244 // Never call destructors on the main thread. This is fine because Blink no |
240 // longer has a graceful shutdown sequence. Be careful to call this function | 245 // longer has a graceful shutdown sequence. Be careful to call this function |
241 // (which can be re-entrant) while the pointer is still set, to avoid lazily | 246 // (which can be re-entrant) while the pointer is still set, to avoid lazily |
242 // allocating WTFThreadData after it is destroyed. | 247 // allocating WTFThreadData after it is destroyed. |
243 if (isMainThread()) | 248 if (internal::isMainThreadSyscall()) |
244 return; | 249 return; |
245 | 250 |
246 data->value->~T(); | 251 data->value->~T(); |
247 Partitions::fastFree(data->value); | 252 Partitions::fastFree(data->value); |
248 | 253 |
249 #if OS(POSIX) | 254 #if OS(POSIX) |
250 pthread_setspecific(data->owner->m_key, 0); | 255 pthread_setspecific(data->owner->m_key, 0); |
251 #elif OS(WIN) | 256 #elif OS(WIN) |
252 TlsSetValue(tlsKeys()[data->owner->m_index], 0); | 257 TlsSetValue(tlsKeys()[data->owner->m_index], 0); |
253 #else | 258 #else |
(...skipping 29 matching lines...) Expand all Loading... | |
283 if (UNLIKELY(!*ptr)) { | 288 if (UNLIKELY(!*ptr)) { |
284 *ptr = static_cast<T*>(Partitions::fastZeroedMalloc( | 289 *ptr = static_cast<T*>(Partitions::fastZeroedMalloc( |
285 sizeof(T), WTF_HEAP_PROFILER_TYPE_NAME(T))); | 290 sizeof(T), WTF_HEAP_PROFILER_TYPE_NAME(T))); |
286 set(*ptr); | 291 set(*ptr); |
287 new (NotNull, *ptr) T; | 292 new (NotNull, *ptr) T; |
288 } | 293 } |
289 return *ptr; | 294 return *ptr; |
290 } | 295 } |
291 | 296 |
292 template <typename T> | 297 template <typename T> |
298 inline void ThreadSpecific<T>::initializeOnOffThread() {} | |
299 template <typename T> | |
300 inline void ThreadSpecific<T>::initializeOnMainThread() {} | |
301 | |
302 template <typename T> | |
293 inline T* ThreadSpecific<T>::operator->() { | 303 inline T* ThreadSpecific<T>::operator->() { |
294 return operator T*(); | 304 return operator T*(); |
295 } | 305 } |
296 | 306 |
297 template <typename T> | 307 template <typename T> |
298 inline T& ThreadSpecific<T>::operator*() { | 308 inline T& ThreadSpecific<T>::operator*() { |
299 return *operator T*(); | 309 return *operator T*(); |
300 } | 310 } |
301 | 311 |
302 } // namespace WTF | 312 } // namespace WTF |
303 | 313 |
304 using WTF::ThreadSpecific; | 314 using WTF::ThreadSpecific; |
305 | 315 |
306 #endif // WTF_ThreadSpecific_h | 316 #endif // WTF_ThreadSpecific_h |
OLD | NEW |