1 // 2 // detail/posix_tss_ptr.hpp 3 // ~~~~~~~~~~~~~~~~~~~~~~~~ 4 // 5 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com) 6 // 7 // Distributed under the Boost Software License, Version 1.0. (See accompanying 8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 9 // 10 11 #ifndef ASIO_DETAIL_POSIX_TSS_PTR_HPP 12 #define ASIO_DETAIL_POSIX_TSS_PTR_HPP 13 14 15 #include "asio/detail/config.hpp" 16 17 #if defined(ASIO_HAS_PTHREADS) 18 19 #include <pthread.h> 20 #include "asio/detail/noncopyable.hpp" 21 22 #include "asio/detail/push_options.hpp" 23 24 namespace asio { 25 namespace detail { 26 27 // Helper function to create thread-specific storage. 28 ASIO_DECL void posix_tss_ptr_create(pthread_key_t& key); 29 30 template <typename T> 31 class posix_tss_ptr 32 : private noncopyable 33 { 34 public: 35 // Constructor. posix_tss_ptr()36 posix_tss_ptr() 37 { 38 posix_tss_ptr_create(tss_key_); 39 } 40 41 // Destructor. ~posix_tss_ptr()42 ~posix_tss_ptr() 43 { 44 ::pthread_key_delete(tss_key_); 45 } 46 47 // Get the value. operator T*() const48 operator T*() const 49 { 50 return static_cast<T*>(::pthread_getspecific(tss_key_)); 51 } 52 53 // Set the value. operator =(T * value)54 void operator=(T* value) 55 { 56 ::pthread_setspecific(tss_key_, value); 57 } 58 59 private: 60 // Thread-specific storage to allow unlocked access to determine whether a 61 // thread is a member of the pool. 62 pthread_key_t tss_key_; 63 }; 64 65 } // namespace detail 66 } // namespace asio 67 68 #include "asio/detail/pop_options.hpp" 69 70 # include "asio/detail/impl/posix_tss_ptr.ipp" 71 72 #endif // defined(ASIO_HAS_PTHREADS) 73 74 #endif // ASIO_DETAIL_POSIX_TSS_PTR_HPP 75