From 81432422c631070a0bf57dc6ccd32d545b970a6d Mon Sep 17 00:00:00 2001 From: Allan Odgaard Date: Tue, 27 Sep 2016 17:21:56 +0200 Subject: [PATCH] Revert "Use thread_local instead of our own implementation" This reverts commit 1658d6356a0e8d341e769234271505bdc977119e. --- Frameworks/crash/src/info.cc | 5 +++-- Shared/include/oak/tls_ptr.h | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 Shared/include/oak/tls_ptr.h diff --git a/Frameworks/crash/src/info.cc b/Frameworks/crash/src/info.cc index 72be07ba..89aaaad8 100644 --- a/Frameworks/crash/src/info.cc +++ b/Frameworks/crash/src/info.cc @@ -1,5 +1,6 @@ #include "info.h" #include +#include /* CrashReporter info */ char const* __crashreporter_info__ = nullptr; @@ -58,8 +59,8 @@ namespace static stack_t& stack () { - thread_local stack_t stack; - return stack; + static oak::tls_ptr_t stackPtr; + return *stackPtr; } } diff --git a/Shared/include/oak/tls_ptr.h b/Shared/include/oak/tls_ptr.h new file mode 100644 index 00000000..c28d506c --- /dev/null +++ b/Shared/include/oak/tls_ptr.h @@ -0,0 +1,36 @@ +#ifndef TLS_PTR_H_186F0BAB +#define TLS_PTR_H_186F0BAB + +namespace oak +{ + template + struct tls_ptr_t + { + tls_ptr_t () { pthread_key_create(&_key, destructor); } + ~tls_ptr_t () { } + + tls_ptr_t (tls_ptr_t const& rhs) = delete; + tls_ptr_t& operator= (tls_ptr_t const& rhs) = delete; + + T& operator* () const { return *get(); } + T* operator-> () const { return get(); } + + private: + T* get () const + { + T* valuePtr = static_cast(pthread_getspecific(_key)); + if(!valuePtr) + { + pthread_setspecific(_key, new T); + valuePtr = static_cast(pthread_getspecific(_key)); + } + return valuePtr; + } + + static void destructor (void* valuePtr) { delete static_cast(valuePtr); } + + pthread_key_t _key; + }; +} /* oak */ + +#endif /* end of include guard: TLS_PTR_H_186F0BAB */