| 2430 | } |
| 2431 | |
| 2432 | T* GetOrCreateValue() const { |
| 2433 | ThreadLocalValueHolderBase* const holder = |
| 2434 | static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_)); |
| 2435 | if (holder != NULL) { |
| 2436 | return CheckedDowncastToActualType<ValueHolder>(holder)->pointer(); |
| 2437 | } |
| 2438 | |
| 2439 | ValueHolder* const new_holder = new ValueHolder(default_); |
| 2440 | ThreadLocalValueHolderBase* const holder_base = new_holder; |
| 2441 | GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base)); |
| 2442 | return new_holder->pointer(); |
| 2443 | } |
| 2444 | |
| 2445 | // A key pthreads uses for looking up per-thread values. |
| 2446 | const pthread_key_t key_; |