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: third_party/WebKit/Source/wtf/ThreadSpecific.h

Issue 2627153004: Use TLS storage for thread ids in wtf/ThreadingPThreads (Closed)
Patch Set: just move isMainThread() down to avoid lazy alloc Created 3 years, 11 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
« no previous file with comments | « no previous file | third_party/WebKit/Source/wtf/Threading.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 27 matching lines...) Expand all
38 * This semantic discrepancy does not impose any problem because nowhere in 38 * This semantic discrepancy does not impose any problem because nowhere in
39 * WebKit the repeated call bahavior is utilized. 39 * WebKit the repeated call bahavior is utilized.
40 */ 40 */
41 41
42 #ifndef WTF_ThreadSpecific_h 42 #ifndef WTF_ThreadSpecific_h
43 #define WTF_ThreadSpecific_h 43 #define WTF_ThreadSpecific_h
44 44
45 #include "wtf/Allocator.h" 45 #include "wtf/Allocator.h"
46 #include "wtf/Noncopyable.h" 46 #include "wtf/Noncopyable.h"
47 #include "wtf/StdLibExtras.h" 47 #include "wtf/StdLibExtras.h"
48 #include "wtf/Threading.h"
Charlie Harrison 2017/01/13 16:38:45 Remove this.
Charlie Harrison 2017/01/13 16:56:55 Done.
48 #include "wtf/WTF.h" 49 #include "wtf/WTF.h"
49 #include "wtf/WTFExport.h" 50 #include "wtf/WTFExport.h"
50 #include "wtf/allocator/PartitionAllocator.h" 51 #include "wtf/allocator/PartitionAllocator.h"
51 #include "wtf/allocator/Partitions.h" 52 #include "wtf/allocator/Partitions.h"
52 53
53 #if OS(POSIX) 54 #if OS(POSIX)
54 #include <pthread.h> 55 #include <pthread.h>
55 #elif OS(WIN) 56 #elif OS(WIN)
56 #include <windows.h> 57 #include <windows.h>
57 #endif 58 #endif
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 data->destructor = &ThreadSpecific<T>::destroy; 218 data->destructor = &ThreadSpecific<T>::destroy;
218 TlsSetValue(tlsKeys()[m_index], data); 219 TlsSetValue(tlsKeys()[m_index], data);
219 } 220 }
220 221
221 #else 222 #else
222 #error ThreadSpecific is not implemented for this platform. 223 #error ThreadSpecific is not implemented for this platform.
223 #endif 224 #endif
224 225
225 template <typename T> 226 template <typename T>
226 inline void ThreadSpecific<T>::destroy(void* ptr) { 227 inline void ThreadSpecific<T>::destroy(void* ptr) {
227 // Never call destructors on the main thread.
228 // This is fine because Blink no longer has a graceful shutdown sequence.
229 if (isMainThread())
230 return;
231
232 Data* data = static_cast<Data*>(ptr); 228 Data* data = static_cast<Data*>(ptr);
233 229
234 #if OS(POSIX) 230 #if OS(POSIX)
235 // We want get() to keep working while data destructor works, because it can 231 // We want get() to keep working while data destructor works, because it can
236 // be called indirectly by the destructor. Some pthreads implementations 232 // be called indirectly by the destructor. Some pthreads implementations
237 // zero out the pointer before calling destroy(), so we temporarily reset it. 233 // zero out the pointer before calling destroy(), so we temporarily reset it.
238 pthread_setspecific(data->owner->m_key, ptr); 234 pthread_setspecific(data->owner->m_key, ptr);
239 #endif 235 #endif
240 236
237 // Never call destructors on the main thread. This is fine because Blink no
238 // longer has a graceful shutdown sequence. Be careful to call this function
239 // (which can be re-entrant) while the pointer is still set, to avoid lazily
240 // allocating WTFThreadData after it is destroyed.
241 if (isMainThread())
242 return;
243
241 data->value->~T(); 244 data->value->~T();
242 Partitions::fastFree(data->value); 245 Partitions::fastFree(data->value);
243 246
244 #if OS(POSIX) 247 #if OS(POSIX)
245 pthread_setspecific(data->owner->m_key, 0); 248 pthread_setspecific(data->owner->m_key, 0);
246 #elif OS(WIN) 249 #elif OS(WIN)
247 TlsSetValue(tlsKeys()[data->owner->m_index], 0); 250 TlsSetValue(tlsKeys()[data->owner->m_index], 0);
248 #else 251 #else
249 #error ThreadSpecific is not implemented for this platform. 252 #error ThreadSpecific is not implemented for this platform.
250 #endif 253 #endif
(...skipping 29 matching lines...) Expand all
280 template <typename T> 283 template <typename T>
281 inline T& ThreadSpecific<T>::operator*() { 284 inline T& ThreadSpecific<T>::operator*() {
282 return *operator T*(); 285 return *operator T*();
283 } 286 }
284 287
285 } // namespace WTF 288 } // namespace WTF
286 289
287 using WTF::ThreadSpecific; 290 using WTF::ThreadSpecific;
288 291
289 #endif // WTF_ThreadSpecific_h 292 #endif // WTF_ThreadSpecific_h
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Source/wtf/Threading.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698