From f990a51163275f22b77c91d10d1a9193fdaa40e6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Tue, 23 Apr 2013 09:42:48 +0100 Subject: [PATCH] Revert "Remove os::thread_specific_ptr" This reverts commit 67ec200baea241d55bea33c43fd5194d90d9e401. --- common/os_thread.hpp | 81 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/common/os_thread.hpp b/common/os_thread.hpp index 2c3f732..5ec7f5d 100644 --- a/common/os_thread.hpp +++ b/common/os_thread.hpp @@ -26,7 +26,7 @@ /* * OS native thread abstraction. * - * Mimics C++11 threads. + * Mimics C++11 / boost threads. */ #ifndef _OS_THREAD_HPP_ @@ -283,6 +283,85 @@ namespace os { }; + /** + * Same interface as boost::thread_specific_ptr. + */ + template + class thread_specific_ptr + { + private: +#ifdef _WIN32 + DWORD dwTlsIndex; +#else + pthread_key_t key; + + static void destructor(void *ptr) { + delete static_cast(ptr); + } +#endif + + public: + thread_specific_ptr(void) { +#ifdef _WIN32 + dwTlsIndex = TlsAlloc(); +#else + pthread_key_create(&key, &destructor); +#endif + } + + ~thread_specific_ptr() { +#ifdef _WIN32 + TlsFree(dwTlsIndex); +#else + pthread_key_delete(key); +#endif + } + + T* get(void) const { + void *ptr; +#ifdef _WIN32 + ptr = TlsGetValue(dwTlsIndex); +#else + ptr = pthread_getspecific(key); +#endif + return static_cast(ptr); + } + + T* operator -> (void) const + { + return get(); + } + + T& operator * (void) const + { + return *get(); + } + + void reset(T* new_value=0) { + T * old_value = get(); + set(new_value); + if (old_value) { + delete old_value; + } + } + + T* release (void) { + T * old_value = get(); + set(0); + return old_value; + } + +private: + void set(T* new_value) { +#ifdef _WIN32 + TlsSetValue(dwTlsIndex, new_value); +#else + pthread_setspecific(key, new_value); +#endif + } + }; + + /** * Same interface as std::thread */ -- 2.43.0