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