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
|