| // Copyright 2013 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef FLUTTER_FML_THREAD_LOCAL_H_ | |
| #define FLUTTER_FML_THREAD_LOCAL_H_ | |
| #include <memory> | |
| #include "flutter/fml/build_config.h" | |
| #include "flutter/fml/macros.h" | |
| #define FML_THREAD_LOCAL_PTHREADS OS_MACOSX || OS_LINUX || OS_ANDROID | |
| #if FML_THREAD_LOCAL_PTHREADS | |
| #include <pthread.h> | |
| #endif | |
| namespace fml { | |
| #if FML_THREAD_LOCAL_PTHREADS | |
| #define FML_THREAD_LOCAL static | |
| namespace internal { | |
| class ThreadLocalPointer { | |
| public: | |
| ThreadLocalPointer(void (*destroy)(void*)); | |
| ~ThreadLocalPointer(); | |
| void* get() const; | |
| void* swap(void* ptr); | |
| private: | |
| pthread_key_t key_; | |
| FML_DISALLOW_COPY_AND_ASSIGN(ThreadLocalPointer); | |
| }; | |
| } // namespace internal | |
| template <typename T> | |
| class ThreadLocalUniquePtr { | |
| public: | |
| ThreadLocalUniquePtr() : ptr_(destroy) {} | |
| T* get() const { return reinterpret_cast<T*>(ptr_.get()); } | |
| void reset(T* ptr) { destroy(ptr_.swap(ptr)); } | |
| private: | |
| static void destroy(void* ptr) { delete reinterpret_cast<T*>(ptr); } | |
| internal::ThreadLocalPointer ptr_; | |
| FML_DISALLOW_COPY_AND_ASSIGN(ThreadLocalUniquePtr); | |
| }; | |
| #else // FML_THREAD_LOCAL_PTHREADS | |
| #define FML_THREAD_LOCAL static thread_local | |
| template <typename T> | |
| class ThreadLocalUniquePtr { | |
| public: | |
| ThreadLocalUniquePtr() = default; | |
| T* get() const { return ptr_.get(); } | |
| void reset(T* ptr) { ptr_.reset(ptr); } | |
| private: | |
| std::unique_ptr<T> ptr_; | |
| FML_DISALLOW_COPY_AND_ASSIGN(ThreadLocalUniquePtr); | |
| }; | |
| #endif // FML_THREAD_LOCAL_PTHREADS | |
| #ifndef FML_THREAD_LOCAL | |
| #error Thread local storage unavailable on the platform. | |
| #endif // FML_THREAD_LOCAL | |
| } // namespace fml | |
| #endif // FLUTTER_FML_THREAD_LOCAL_H_ |