Remote Call Framework 3.2
ThreadLocalData.hpp
1 
2 //******************************************************************************
3 // RCF - Remote Call Framework
4 //
5 // Copyright (c) 2005 - 2020, 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: 3.2
15 // Contact: support <at> deltavsoft.com
16 //
17 //******************************************************************************
18 
19 #ifndef INCLUDE_RCF_THREADLOCALDATA_HPP
20 #define INCLUDE_RCF_THREADLOCALDATA_HPP
21 
22 #include <codecvt>
23 #include <functional>
24 #include <locale>
25 #include <memory>
26 #include <vector>
27 
28 #include <RCF/Config.hpp>
29 #include <RCF/Export.hpp>
30 
31 #ifdef RCF_WINDOWS
32 #include <WinSock2.h>
33 #endif
34 
35 #ifndef RCF_WINDOWS
36 struct iovec;
37 #endif
38 
39 namespace RCF {
40 
41  class ObjectCache;
42  class ClientStub;
43  class RcfSession;
44  class ThreadInfo;
45  class UdpNetworkSession;
46  class I_Future;
47  class AmiNotification;
48  class OverlappedAmi;
49  class LogBuffers;
50  class Filter;
51  class FileUpload;
52  class ByteBuffer;
53 
54  typedef std::shared_ptr<ClientStub> ClientStubPtr;
55  typedef std::shared_ptr<RcfSession> RcfSessionPtr;
56  typedef std::shared_ptr<ThreadInfo> ThreadInfoPtr;
57  typedef std::shared_ptr<UdpNetworkSession> UdpNetworkSessionPtr;
58  typedef std::shared_ptr<OverlappedAmi> OverlappedAmiPtr;
59  typedef std::shared_ptr<LogBuffers> LogBuffersPtr;
60  typedef std::function<void(RcfSession&)> RcfSessionCallback;
61  typedef std::shared_ptr<Filter> FilterPtr;
62 
63  template<typename T1, typename T2>
64  class RecursionState;
65 
66 #ifndef RCF_WINDOWS
67  typedef iovec WSABUF;
68 #endif
69 
70  class ThreadLocalData;
71  ThreadLocalData & getThreadLocalData();
72 
73  RCF_EXPORT ClientStub * getTlsClientStubPtr();
74 
75  RCF_EXPORT void pushTlsClientStub(
76  ClientStub * pClientStub);
77 
78  RCF_EXPORT void popTlsClientStub();
79 
80  RCF_EXPORT RcfSession * getCurrentRcfSessionPtr();
81  RCF_EXPORT RcfSession * getTlsRcfSessionPtr();
82 
83  RCF_EXPORT void setTlsRcfSessionPtr(
84  RcfSession * pRcfSession = NULL);
85 
86  RCF_EXPORT std::vector<RcfSession*>& getRcfSessionSentryStack();
87 
88  RCF_EXPORT ThreadInfoPtr getTlsThreadInfoPtr();
89 
90  RCF_EXPORT void setTlsThreadInfoPtr(
91  ThreadInfoPtr threadInfoPtr);
92 
93  RCF_EXPORT UdpNetworkSessionPtr getTlsUdpNetworkSessionPtr();
94 
95  RCF_EXPORT void setTlsUdpNetworkSessionPtr(
96  UdpNetworkSessionPtr udpNetworkSessionPtr);
97 
98  RCF_EXPORT RcfSession & getTlsRcfSession();
99 
100  RecursionState<int, int> & getTlsRcfSessionRecursionState();
101 
102  RCF_EXPORT AmiNotification & getTlsAmiNotification();
103 
104  RCF_EXPORT LogBuffers & getTlsLogBuffers();
105 
106  RCF_EXPORT std::vector< std::vector<RCF::ByteBuffer> * > &
107  getTlsCache(std::vector<RCF::ByteBuffer> *);
108 
109  RCF_EXPORT std::vector< std::vector<int> * > &
110  getTlsCache(std::vector<int> *);
111 
112  RCF_EXPORT std::vector< std::vector<WSABUF> * > &
113  getTlsCache(std::vector<WSABUF> *);
114 
115  RCF_EXPORT std::vector< std::vector<FilterPtr> * > &
116  getTlsCache(std::vector<FilterPtr> *);
117 
118  RCF_EXPORT std::vector< std::vector<RcfSessionCallback> * > &
119  getTlsCache(std::vector<RcfSessionCallback> *);
120 
121  RCF_EXPORT std::vector< std::vector<FileUpload> * > &
122  getTlsCache(std::vector<FileUpload> *);
123 
124  std::wstring_convert<std::codecvt_utf8<wchar_t> > &
125  getTlsUtf8Converter();
126 
127  template<typename T>
128  class ThreadLocalCached
129  {
130  public:
131 
132  ThreadLocalCached() : mpt(NULL)
133  {
134  std::vector<T *> & tlsCache = getTlsCache( (T *) NULL);
135  if (tlsCache.empty())
136  {
137  mpt = new T();
138  }
139  else
140  {
141  mpt = tlsCache.back();
142  tlsCache.pop_back();
143  }
144  RCF_ASSERT(mpt->empty());
145  }
146 
147  ~ThreadLocalCached()
148  {
149  mpt->clear();
150  std::vector<T *> & tlsCache = getTlsCache( (T *) NULL);
151  tlsCache.push_back(mpt);
152  mpt = NULL;
153  }
154 
155  T & get()
156  {
157  return *mpt;
158  }
159 
160  private:
161 
162  T * mpt;
163  };
164 
165 
166 } // namespace RCF
167 
168 #endif // ! INCLUDE_RCF_THREADLOCALDATA_HPP
Definition: AmiIoHandler.hpp:24