| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 #include "SkThread.h" | 8 #include "SkThread.h" |
| 9 #include "SkTLS.h" | |
| 10 | 9 |
| 11 #include <pthread.h> | 10 #include <pthread.h> |
| 12 #include <errno.h> | 11 #include <errno.h> |
| 13 | 12 |
| 14 #ifndef SK_BUILD_FOR_ANDROID | 13 #ifndef SK_BUILD_FOR_ANDROID |
| 15 | 14 |
| 16 /** | 15 /** |
| 17 We prefer the GCC intrinsic implementation of the atomic operations over the | 16 We prefer the GCC intrinsic implementation of the atomic operations over the |
| 18 SkMutex-based implementation. The SkMutex version suffers from static | 17 SkMutex-based implementation. The SkMutex version suffers from static |
| 19 destructor ordering problems. | 18 destructor ordering problems. |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 SkASSERT(0 == status); | 188 SkASSERT(0 == status); |
| 190 } | 189 } |
| 191 | 190 |
| 192 void SkMutex::release() { | 191 void SkMutex::release() { |
| 193 int status = pthread_mutex_unlock((pthread_mutex_t*)fStorage); | 192 int status = pthread_mutex_unlock((pthread_mutex_t*)fStorage); |
| 194 print_pthread_error(status); | 193 print_pthread_error(status); |
| 195 SkASSERT(0 == status); | 194 SkASSERT(0 == status); |
| 196 } | 195 } |
| 197 | 196 |
| 198 #endif // !SK_USE_POSIX_THREADS | 197 #endif // !SK_USE_POSIX_THREADS |
| 199 | |
| 200 /////////////////////////////////////////////////////////////////////////////// | |
| 201 | |
| 202 static pthread_key_t gSkTLSKey; | |
| 203 static pthread_once_t gSkTLSKey_Once = PTHREAD_ONCE_INIT; | |
| 204 | |
| 205 static void sk_tls_make_key() { | |
| 206 (void)pthread_key_create(&gSkTLSKey, SkTLS::Destructor); | |
| 207 } | |
| 208 | |
| 209 void* SkTLS::PlatformGetSpecific(bool forceCreateTheSlot) { | |
| 210 // should we use forceCreateTheSlot to potentially skip calling pthread_once | |
| 211 // and just return NULL if we've never been called with | |
| 212 // forceCreateTheSlot==true ? | |
| 213 | |
| 214 (void)pthread_once(&gSkTLSKey_Once, sk_tls_make_key); | |
| 215 return pthread_getspecific(gSkTLSKey); | |
| 216 } | |
| 217 | |
| 218 void SkTLS::PlatformSetSpecific(void* ptr) { | |
| 219 (void)pthread_setspecific(gSkTLSKey, ptr); | |
| 220 } | |
| OLD | NEW |