Chris@16: #ifndef BOOST_THREAD_TSS_HPP Chris@16: #define BOOST_THREAD_TSS_HPP Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: // (C) Copyright 2007-8 Anthony Williams Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: namespace detail Chris@16: { Chris@16: struct tss_cleanup_function Chris@16: { Chris@16: virtual ~tss_cleanup_function() Chris@16: {} Chris@101: Chris@16: virtual void operator()(void* data)=0; Chris@16: }; Chris@101: Chris@16: BOOST_THREAD_DECL void set_tss_data(void const* key,boost::shared_ptr func,void* tss_data,bool cleanup_existing); Chris@16: BOOST_THREAD_DECL void* get_tss_data(void const* key); Chris@16: } Chris@16: Chris@16: template Chris@16: class thread_specific_ptr Chris@16: { Chris@16: private: Chris@16: thread_specific_ptr(thread_specific_ptr&); Chris@16: thread_specific_ptr& operator=(thread_specific_ptr&); Chris@16: Chris@16: struct delete_data: Chris@16: detail::tss_cleanup_function Chris@16: { Chris@16: void operator()(void* data) Chris@16: { Chris@16: delete static_cast(data); Chris@16: } Chris@16: }; Chris@101: Chris@16: struct run_custom_cleanup_function: Chris@16: detail::tss_cleanup_function Chris@16: { Chris@16: void (*cleanup_function)(T*); Chris@101: Chris@16: explicit run_custom_cleanup_function(void (*cleanup_function_)(T*)): Chris@16: cleanup_function(cleanup_function_) Chris@16: {} Chris@101: Chris@16: void operator()(void* data) Chris@16: { Chris@16: cleanup_function(static_cast(data)); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: boost::shared_ptr cleanup; Chris@101: Chris@16: public: Chris@16: typedef T element_type; Chris@101: Chris@16: thread_specific_ptr(): Chris@16: cleanup(detail::heap_new(),detail::do_heap_delete()) Chris@16: {} Chris@16: explicit thread_specific_ptr(void (*func_)(T*)) Chris@16: { Chris@16: if(func_) Chris@16: { Chris@16: cleanup.reset(detail::heap_new(func_),detail::do_heap_delete()); Chris@16: } Chris@16: } Chris@16: ~thread_specific_ptr() Chris@16: { Chris@16: detail::set_tss_data(this,boost::shared_ptr(),0,true); Chris@16: } Chris@16: Chris@16: T* get() const Chris@16: { Chris@16: return static_cast(detail::get_tss_data(this)); Chris@16: } Chris@16: T* operator->() const Chris@16: { Chris@16: return get(); Chris@16: } Chris@101: typename boost::detail::sp_dereference< T >::type operator*() const Chris@16: { Chris@16: return *get(); Chris@16: } Chris@16: T* release() Chris@16: { Chris@16: T* const temp=get(); Chris@16: detail::set_tss_data(this,boost::shared_ptr(),0,false); Chris@16: return temp; Chris@16: } Chris@16: void reset(T* new_value=0) Chris@16: { Chris@16: T* const current_value=get(); Chris@16: if(current_value!=new_value) Chris@16: { Chris@16: detail::set_tss_data(this,cleanup,new_value,true); Chris@16: } Chris@16: } Chris@16: }; Chris@16: } Chris@16: Chris@16: #include Chris@16: Chris@16: #endif