| 2621 | } |
| 2622 | |
| 2623 | T* GetOrCreateValue() const { |
| 2624 | ThreadLocalValueHolderBase* const holder = |
| 2625 | static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_)); |
| 2626 | if (holder != NULL) { |
| 2627 | return CheckedDowncastToActualType<ValueHolder>(holder)->pointer(); |
| 2628 | } |
| 2629 | |
| 2630 | ValueHolder* const new_holder = new ValueHolder(default_); |
| 2631 | ThreadLocalValueHolderBase* const holder_base = new_holder; |
| 2632 | GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base)); |
| 2633 | return new_holder->pointer(); |
| 2634 | } |
| 2635 | |
| 2636 | // A key pthreads uses for looking up per-thread values. |
| 2637 | const pthread_key_t key_; |