1 // 2 // detail/win_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 BOOST_ASIO_DETAIL_WIN_TSS_PTR_HPP 12 #define BOOST_ASIO_DETAIL_WIN_TSS_PTR_HPP 13 14 #if defined(_MSC_VER) && (_MSC_VER >= 1200) 15 # pragma once 16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) 17 18 #include <boost/asio/detail/config.hpp> 19 20 #if defined(BOOST_ASIO_WINDOWS) 21 22 #include <boost/asio/detail/noncopyable.hpp> 23 #include <boost/asio/detail/socket_types.hpp> 24 25 #include <boost/asio/detail/push_options.hpp> 26 27 namespace boost { 28 namespace asio { 29 namespace detail { 30 31 // Helper function to create thread-specific storage. 32 BOOST_ASIO_DECL DWORD win_tss_ptr_create(); 33 34 template <typename T> 35 class win_tss_ptr 36 : private noncopyable 37 { 38 public: 39 // Constructor. win_tss_ptr()40 win_tss_ptr() 41 : tss_key_(win_tss_ptr_create()) 42 { 43 } 44 45 // Destructor. ~win_tss_ptr()46 ~win_tss_ptr() 47 { 48 ::TlsFree(tss_key_); 49 } 50 51 // Get the value. operator T*() const52 operator T*() const 53 { 54 return static_cast<T*>(::TlsGetValue(tss_key_)); 55 } 56 57 // Set the value. operator =(T * value)58 void operator=(T* value) 59 { 60 ::TlsSetValue(tss_key_, value); 61 } 62 63 private: 64 // Thread-specific storage to allow unlocked access to determine whether a 65 // thread is a member of the pool. 66 DWORD tss_key_; 67 }; 68 69 } // namespace detail 70 } // namespace asio 71 } // namespace boost 72 73 #include <boost/asio/detail/pop_options.hpp> 74 75 #if defined(BOOST_ASIO_HEADER_ONLY) 76 # include <boost/asio/detail/impl/win_tss_ptr.ipp> 77 #endif // defined(BOOST_ASIO_HEADER_ONLY) 78 79 #endif // defined(BOOST_ASIO_WINDOWS) 80 81 #endif // BOOST_ASIO_DETAIL_WIN_TSS_PTR_HPP 82