annotate DEPENDENCIES/generic/include/boost/thread/tss.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 #ifndef BOOST_THREAD_TSS_HPP
Chris@16 2 #define BOOST_THREAD_TSS_HPP
Chris@16 3 // Distributed under the Boost Software License, Version 1.0. (See
Chris@16 4 // accompanying file LICENSE_1_0.txt or copy at
Chris@16 5 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 6 // (C) Copyright 2007-8 Anthony Williams
Chris@16 7
Chris@16 8 #include <boost/thread/detail/config.hpp>
Chris@16 9 #include <boost/shared_ptr.hpp>
Chris@16 10 #include <boost/thread/detail/thread_heap_alloc.hpp>
Chris@16 11
Chris@16 12 #include <boost/config/abi_prefix.hpp>
Chris@16 13
Chris@16 14 namespace boost
Chris@16 15 {
Chris@16 16 namespace detail
Chris@16 17 {
Chris@16 18 struct tss_cleanup_function
Chris@16 19 {
Chris@16 20 virtual ~tss_cleanup_function()
Chris@16 21 {}
Chris@101 22
Chris@16 23 virtual void operator()(void* data)=0;
Chris@16 24 };
Chris@101 25
Chris@16 26 BOOST_THREAD_DECL void set_tss_data(void const* key,boost::shared_ptr<tss_cleanup_function> func,void* tss_data,bool cleanup_existing);
Chris@16 27 BOOST_THREAD_DECL void* get_tss_data(void const* key);
Chris@16 28 }
Chris@16 29
Chris@16 30 template <typename T>
Chris@16 31 class thread_specific_ptr
Chris@16 32 {
Chris@16 33 private:
Chris@16 34 thread_specific_ptr(thread_specific_ptr&);
Chris@16 35 thread_specific_ptr& operator=(thread_specific_ptr&);
Chris@16 36
Chris@16 37 struct delete_data:
Chris@16 38 detail::tss_cleanup_function
Chris@16 39 {
Chris@16 40 void operator()(void* data)
Chris@16 41 {
Chris@16 42 delete static_cast<T*>(data);
Chris@16 43 }
Chris@16 44 };
Chris@101 45
Chris@16 46 struct run_custom_cleanup_function:
Chris@16 47 detail::tss_cleanup_function
Chris@16 48 {
Chris@16 49 void (*cleanup_function)(T*);
Chris@101 50
Chris@16 51 explicit run_custom_cleanup_function(void (*cleanup_function_)(T*)):
Chris@16 52 cleanup_function(cleanup_function_)
Chris@16 53 {}
Chris@101 54
Chris@16 55 void operator()(void* data)
Chris@16 56 {
Chris@16 57 cleanup_function(static_cast<T*>(data));
Chris@16 58 }
Chris@16 59 };
Chris@16 60
Chris@16 61
Chris@16 62 boost::shared_ptr<detail::tss_cleanup_function> cleanup;
Chris@101 63
Chris@16 64 public:
Chris@16 65 typedef T element_type;
Chris@101 66
Chris@16 67 thread_specific_ptr():
Chris@16 68 cleanup(detail::heap_new<delete_data>(),detail::do_heap_delete<delete_data>())
Chris@16 69 {}
Chris@16 70 explicit thread_specific_ptr(void (*func_)(T*))
Chris@16 71 {
Chris@16 72 if(func_)
Chris@16 73 {
Chris@16 74 cleanup.reset(detail::heap_new<run_custom_cleanup_function>(func_),detail::do_heap_delete<run_custom_cleanup_function>());
Chris@16 75 }
Chris@16 76 }
Chris@16 77 ~thread_specific_ptr()
Chris@16 78 {
Chris@16 79 detail::set_tss_data(this,boost::shared_ptr<detail::tss_cleanup_function>(),0,true);
Chris@16 80 }
Chris@16 81
Chris@16 82 T* get() const
Chris@16 83 {
Chris@16 84 return static_cast<T*>(detail::get_tss_data(this));
Chris@16 85 }
Chris@16 86 T* operator->() const
Chris@16 87 {
Chris@16 88 return get();
Chris@16 89 }
Chris@101 90 typename boost::detail::sp_dereference< T >::type operator*() const
Chris@16 91 {
Chris@16 92 return *get();
Chris@16 93 }
Chris@16 94 T* release()
Chris@16 95 {
Chris@16 96 T* const temp=get();
Chris@16 97 detail::set_tss_data(this,boost::shared_ptr<detail::tss_cleanup_function>(),0,false);
Chris@16 98 return temp;
Chris@16 99 }
Chris@16 100 void reset(T* new_value=0)
Chris@16 101 {
Chris@16 102 T* const current_value=get();
Chris@16 103 if(current_value!=new_value)
Chris@16 104 {
Chris@16 105 detail::set_tss_data(this,cleanup,new_value,true);
Chris@16 106 }
Chris@16 107 }
Chris@16 108 };
Chris@16 109 }
Chris@16 110
Chris@16 111 #include <boost/config/abi_suffix.hpp>
Chris@16 112
Chris@16 113 #endif