diff --git a/include/future b/include/future index d482577e..5e53a96b 100644 --- a/include/future +++ b/include/future @@ -677,7 +677,7 @@ __assoc_state<_R>::set_value_at_thread_exit(_Arg& __arg) throw future_error(make_error_code(future_errc::promise_already_satisfied)); ::new(&__value_) _R(_STD::forward<_Arg>(__arg)); this->__state_ |= base::__constructed; - __thread_local_data->__make_ready_at_thread_exit(this); + __thread_local_data()->__make_ready_at_thread_exit(this); __lk.unlock(); } @@ -750,7 +750,7 @@ __assoc_state<_R&>::set_value_at_thread_exit(_R& __arg) throw future_error(make_error_code(future_errc::promise_already_satisfied)); __value_ = &__arg; this->__state_ |= base::__constructed; - __thread_local_data->__make_ready_at_thread_exit(this); + __thread_local_data()->__make_ready_at_thread_exit(this); __lk.unlock(); } diff --git a/include/thread b/include/thread index 25246fa0..7b6cf932 100644 --- a/include/thread +++ b/include/thread @@ -318,13 +318,13 @@ public: void __make_ready_at_thread_exit(__assoc_sub_state*); }; -extern __thread_specific_ptr<__thread_struct> __thread_local_data; +__thread_specific_ptr<__thread_struct>& __thread_local_data(); template void* __thread_proxy(void* __vp) { - __thread_local_data.reset(new __thread_struct); + __thread_local_data().reset(new __thread_struct); std::unique_ptr<_F> __p(static_cast<_F*>(__vp)); (*__p)(); return nullptr; diff --git a/src/condition_variable.cpp b/src/condition_variable.cpp index 3bafa8c8..6727a022 100644 --- a/src/condition_variable.cpp +++ b/src/condition_variable.cpp @@ -64,7 +64,7 @@ condition_variable::__do_timed_wait(unique_lock& lk, void notify_all_at_thread_exit(condition_variable& cond, unique_lock lk) { - __thread_local_data->notify_all_at_thread_exit(&cond, lk.release()); + __thread_local_data()->notify_all_at_thread_exit(&cond, lk.release()); } _LIBCPP_END_NAMESPACE_STD diff --git a/src/future.cpp b/src/future.cpp index 29b58641..f291fe53 100644 --- a/src/future.cpp +++ b/src/future.cpp @@ -83,7 +83,7 @@ __assoc_sub_state::set_value_at_thread_exit() if (__has_value()) throw future_error(make_error_code(future_errc::promise_already_satisfied)); __state_ |= __constructed; - __thread_local_data->__make_ready_at_thread_exit(this); + __thread_local_data()->__make_ready_at_thread_exit(this); __lk.unlock(); } @@ -106,7 +106,7 @@ __assoc_sub_state::set_exception_at_thread_exit(exception_ptr __p) if (__has_value()) throw future_error(make_error_code(future_errc::promise_already_satisfied)); __exception_ = __p; - __thread_local_data->__make_ready_at_thread_exit(this); + __thread_local_data()->__make_ready_at_thread_exit(this); __lk.unlock(); } diff --git a/src/thread.cpp b/src/thread.cpp index 3d388e9f..aa075133 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -83,7 +83,12 @@ sleep_for(const chrono::nanoseconds& ns) } // this_thread -__thread_specific_ptr<__thread_struct> __thread_local_data; +__thread_specific_ptr<__thread_struct>& +__thread_local_data() +{ + static __thread_specific_ptr<__thread_struct> __p; + return __p; +} // __thread_struct_imp