// Copyright Stefan Strasser 2010. // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_SYNCHRO_STATIC_TSS_HPP #define BOOST_SYNCHRO_STATIC_TSS_HPP #include #include namespace boost { namespace synchro { template class static_thread_specific_ptr; template class static_thread_specific_ptr : noncopyable{ private: static_thread_specific_ptr(); public: #if ((__GNUC__== 3) && (__GNUC_MINOR__ > 4) || __GNUC__>= 4) static void reset(T *p=0){ ptr=p; } static T *get(){ return ptr; } private: static __thread T *ptr; }; template __thread T *static_thread_specific_ptr::ptr(0); #elif defined(BOOST_MSVC) static void reset(T *p=0){ ptr=p; } static T *get(){ return ptr; } private: static __declspec(thread) T *ptr; }; template __declspec(thread) T *static_thread_specific_ptr::ptr(0); #else static void reset(T *p=0){ ptr.reset(p); } static T *get(){ return ptr.get(); } private: static thread_specific_ptr ptr; }; template thread_specific_ptr static_thread_specific_ptr::ptr(0); //null deleter #endif template class static_thread_specific_ptr : noncopyable{ private: static_thread_specific_ptr(); public: static void reset(T *p=0){ ptr=p; } static T *get(){ return ptr; } private: static T *ptr; }; template T *static_thread_specific_ptr::ptr(0); } } #endif