#include #include #include #include #include namespace mbgl { namespace util { template class ThreadLocal; template class ThreadLocal; template class ThreadLocal; template class ThreadLocal::Impl { public: pthread_key_t key; }; template ThreadLocal::ThreadLocal() : impl(std::make_unique()) { int ret = pthread_key_create(&impl->key, [](void *) {}); if (ret) { throw std::runtime_error("Failed to init local storage key."); } } template ThreadLocal::~ThreadLocal() { delete reinterpret_cast(get()); if (pthread_key_delete(impl->key)) { throw std::runtime_error("Failed to delete local storage key."); } } template T* ThreadLocal::get() { T* ret = reinterpret_cast(pthread_getspecific(impl->key)); if (!ret) { return nullptr; } return ret; } template void ThreadLocal::set(T* ptr) { if (pthread_setspecific(impl->key, ptr)) { throw std::runtime_error("Failed to set local storage."); } } } // namespace util } // namespace mbgl