RCFProto
 All Classes Functions Typedefs
ThreadLocalData.hpp
1 
2 //******************************************************************************
3 // RCF - Remote Call Framework
4 //
5 // Copyright (c) 2005 - 2013, Delta V Software. All rights reserved.
6 // http://www.deltavsoft.com
7 //
8 // RCF is distributed under dual licenses - closed source or GPL.
9 // Consult your particular license for conditions of use.
10 //
11 // If you have not purchased a commercial license, you are using RCF
12 // under GPL terms.
13 //
14 // Version: 2.0
15 // Contact: support <at> deltavsoft.com
16 //
17 //******************************************************************************
18 
19 #ifndef INCLUDE_RCF_THREADLOCALDATA_HPP
20 #define INCLUDE_RCF_THREADLOCALDATA_HPP
21 
22 #include <boost/shared_ptr.hpp>
23 
24 #include <RCF/ByteBuffer.hpp>
25 #include <RCF/Export.hpp>
26 #include <RCF/RecursionLimiter.hpp>
27 #include <RCF/ThreadLibrary.hpp>
28 
29 #ifdef BOOST_WINDOWS
30 #include <WinSock2.h>
31 #endif
32 
33 #ifndef BOOST_WINDOWS
34 struct iovec;
35 #endif
36 
37 namespace RCF {
38 
39  class ObjectCache;
40  class ClientStub;
41  class RcfSession;
42  class ThreadInfo;
43  class UdpNetworkSession;
44  class I_Future;
45  class AmiNotification;
46  class OverlappedAmi;
47  class LogBuffers;
48  class Filter;
49  class FileUpload;
50 
51  typedef boost::shared_ptr<ClientStub> ClientStubPtr;
52  typedef boost::shared_ptr<RcfSession> RcfSessionPtr;
53  typedef boost::shared_ptr<ThreadInfo> ThreadInfoPtr;
54  typedef boost::shared_ptr<UdpNetworkSession> UdpNetworkSessionPtr;
55  typedef boost::shared_ptr<OverlappedAmi> OverlappedAmiPtr;
56  typedef boost::shared_ptr<LogBuffers> LogBuffersPtr;
57  typedef boost::function1<void, RcfSession&> RcfSessionCallback;
58  typedef boost::shared_ptr<Filter> FilterPtr;
59 
60 #ifndef BOOST_WINDOWS
61  typedef iovec WSABUF;
62 #endif
63 
64  class ThreadLocalData;
65  ThreadLocalData & getThreadLocalData();
66 
67  RCF_EXPORT void clearThreadLocalDataForThisThread();
68 
69  RCF_EXPORT ClientStub * getTlsClientStubPtr();
70 
71  RCF_EXPORT void pushTlsClientStub(
72  ClientStub * pClientStub);
73 
74  RCF_EXPORT void popTlsClientStub();
75 
76  RCF_EXPORT RcfSession * getCurrentRcfSessionPtr();
77  RCF_EXPORT RcfSession * getTlsRcfSessionPtr();
78 
79  RCF_EXPORT void setTlsRcfSessionPtr(
80  RcfSession * pRcfSession = NULL);
81 
82  RCF_EXPORT std::vector<RcfSession*>& getRcfSessionSentryStack();
83 
84  RCF_EXPORT ThreadInfoPtr getTlsThreadInfoPtr();
85 
86  RCF_EXPORT void setTlsThreadInfoPtr(
87  ThreadInfoPtr threadInfoPtr);
88 
89  RCF_EXPORT UdpNetworkSessionPtr getTlsUdpNetworkSessionPtr();
90 
91  RCF_EXPORT void setTlsUdpNetworkSessionPtr(
92  UdpNetworkSessionPtr udpNetworkSessionPtr);
93 
94  RCF_EXPORT RcfSession & getCurrentRcfSession();
95  RCF_EXPORT RcfSession & getTlsRcfSession();
96 
97  RecursionState<int, int> & getTlsRcfSessionRecursionState();
98 
99  RCF_EXPORT AmiNotification & getTlsAmiNotification();
100 
101  RCF_EXPORT LogBuffers & getTlsLogBuffers();
102 
103  RCF_EXPORT std::vector< std::vector<RCF::ByteBuffer> * > &
104  getTlsCache(std::vector<RCF::ByteBuffer> *);
105 
106  RCF_EXPORT std::vector< std::vector<int> * > &
107  getTlsCache(std::vector<int> *);
108 
109  RCF_EXPORT std::vector< std::vector<WSABUF> * > &
110  getTlsCache(std::vector<WSABUF> *);
111 
112  RCF_EXPORT std::vector< std::vector<FilterPtr> * > &
113  getTlsCache(std::vector<FilterPtr> *);
114 
115  RCF_EXPORT std::vector< std::vector<RcfSessionCallback> * > &
116  getTlsCache(std::vector<RcfSessionCallback> *);
117 
118  RCF_EXPORT std::vector< std::vector<FileUpload> * > &
119  getTlsCache(std::vector<FileUpload> *);
120 
121  template<typename T>
122  class ThreadLocalCached
123  {
124  public:
125 
126  ThreadLocalCached() : mpt(NULL)
127  {
128  std::vector<T *> & tlsCache = getTlsCache( (T *) NULL);
129  if (tlsCache.empty())
130  {
131  mpt = new T();
132  }
133  else
134  {
135  mpt = tlsCache.back();
136  tlsCache.pop_back();
137  }
138  RCF_ASSERT(mpt->empty());
139  }
140 
141  ~ThreadLocalCached()
142  {
143  mpt->clear();
144  std::vector<T *> & tlsCache = getTlsCache( (T *) NULL);
145  tlsCache.push_back(mpt);
146  mpt = NULL;
147  }
148 
149  T & get()
150  {
151  return *mpt;
152  }
153 
154  private:
155 
156  T * mpt;
157  };
158 
159  void RCF_EXPORT addThreadExitHandler(boost::function<void()> func);
160 
161 } // namespace RCF
162 
163 #endif // ! INCLUDE_RCF_THREADLOCALDATA_HPP