EstervQrCode 2.0.0
Library for qr code manipulation
Loading...
Searching...
No Matches
tls.hpp
1// This file is part of OpenCV project.
2// It is subject to the license terms in the LICENSE file found in the top-level directory
3// of this distribution and at http://opencv.org/license.html.
4
5#ifndef OPENCV_UTILS_TLS_HPP
6#define OPENCV_UTILS_TLS_HPP
7
8#ifndef OPENCV_CORE_UTILITY_H
9#error "tls.hpp must be included after opencv2/core/utility.hpp or opencv2/core.hpp"
10#endif
11
12namespace cv {
13
16
17namespace details { class TlsStorage; }
18
26{
27protected:
30
35
36 void* getData() const;
37 void release();
38
39protected:
40 virtual void* createDataInstance() const = 0;
41 virtual void deleteDataInstance(void* pData) const = 0;
42
43private:
44 int key_;
45
46 friend class cv::details::TlsStorage; // core/src/system.cpp
47
48public:
49 void cleanup();
50
51private:
52 // Disable copy/assign (noncopyable pattern)
54 TLSDataContainer& operator =(const TLSDataContainer &) = delete;
55};
56
57
62template <typename T>
63class TLSData : protected TLSDataContainer
64{
65public:
66 inline TLSData() {}
67 inline ~TLSData() { release(); }
68
69 inline T* get() const { return (T*)getData(); }
70 inline T& getRef() const { T* ptr = (T*)getData(); CV_DbgAssert(ptr); return *ptr; }
71
73 inline void cleanup()
74 {
76 }
77
78protected:
80 virtual void* createDataInstance() const CV_OVERRIDE { return new T; }
82 virtual void deleteDataInstance(void* pData) const CV_OVERRIDE { delete (T*)pData; }
83};
84
85
87template <typename T>
88class TLSDataAccumulator : public TLSData<T>
89{
90 mutable cv::Mutex mutex;
91 mutable std::vector<T*> dataFromTerminatedThreads;
92 std::vector<T*> detachedData;
93 bool cleanupMode;
94public:
95 TLSDataAccumulator() : cleanupMode(false) {}
97 {
98 release();
99 }
100
109 {
110 CV_Assert(cleanupMode == false); // state is not valid
111 CV_Assert(data.empty());
112 {
113 std::vector<void*> &dataVoid = reinterpret_cast<std::vector<void*>&>(data);
115 }
116 {
117 AutoLock lock(mutex);
118 data.reserve(data.size() + dataFromTerminatedThreads.size());
119 for (typename std::vector<T*>::const_iterator i = dataFromTerminatedThreads.begin(); i != dataFromTerminatedThreads.end(); ++i)
120 {
121 data.push_back((T*)*i);
122 }
123 }
124 }
125
133 {
134 CV_Assert(cleanupMode == false); // state is not valid
135 std::vector<void*> dataVoid;
136 {
138 }
139 {
140 AutoLock lock(mutex);
141 detachedData.reserve(dataVoid.size() + dataFromTerminatedThreads.size());
142 for (typename std::vector<T*>::const_iterator i = dataFromTerminatedThreads.begin(); i != dataFromTerminatedThreads.end(); ++i)
143 {
144 detachedData.push_back((T*)*i);
145 }
146 dataFromTerminatedThreads.clear();
147 for (typename std::vector<void*>::const_iterator i = dataVoid.begin(); i != dataVoid.end(); ++i)
148 {
149 detachedData.push_back((T*)(void*)*i);
150 }
151 }
152 dataVoid.clear();
153 return detachedData;
154 }
155
158 {
159 AutoLock lock(mutex);
160 cleanupMode = true;
162 cleanupMode = false;
163 }
164
166 void cleanup()
167 {
168 cleanupMode = true;
170
171 AutoLock lock(mutex);
174 cleanupMode = false;
175 }
176
178 void release()
179 {
180 cleanupMode = true;
182 {
183 AutoLock lock(mutex);
186 }
187 }
188
189protected:
190 // synchronized
192 {
193 for (typename std::vector<T*>::iterator i = detachedData.begin(); i != detachedData.end(); ++i)
194 {
195 deleteDataInstance((T*)*i);
196 }
197 detachedData.clear();
198 }
199
200 // synchronized
202 {
203 for (typename std::vector<T*>::iterator i = dataFromTerminatedThreads.begin(); i != dataFromTerminatedThreads.end(); ++i)
204 {
205 deleteDataInstance((T*)*i);
206 }
207 dataFromTerminatedThreads.clear();
208 }
209
210protected:
211 virtual void* createDataInstance() const CV_OVERRIDE
212 {
213 // Note: we can collect all allocated data here, but this would require raced mutex locks
214 return new T;
215 }
216 virtual void deleteDataInstance(void* pData) const CV_OVERRIDE
217 {
218 if (cleanupMode)
219 {
220 delete (T*)pData;
221 }
222 else
223 {
224 AutoLock lock(mutex);
225 dataFromTerminatedThreads.push_back((T*)pData);
226 }
227 }
228};
229
230
232
233} // namespace
234
235#endif // OPENCV_UTILS_TLS_HPP
T begin(T... args)
TLS data accumulator with gathering methods.
Definition tls.hpp:89
TLSDataAccumulator()
Definition tls.hpp:95
void cleanup()
Release associated thread data.
Definition tls.hpp:166
std::vector< T * > & detachData()
Get and detach data from all threads.
Definition tls.hpp:132
void cleanupDetachedData()
Release associated thread data returned by detachData() call.
Definition tls.hpp:157
void _cleanupDetachedData()
Definition tls.hpp:191
void release()
Release associated thread data and free TLS key.
Definition tls.hpp:178
void gather(std::vector< T * > &data) const
Get data from all threads.
Definition tls.hpp:108
~TLSDataAccumulator()
Definition tls.hpp:96
virtual void * createDataInstance() const CV_OVERRIDE
Wrapper to allocate data by template.
Definition tls.hpp:211
virtual void deleteDataInstance(void *pData) const CV_OVERRIDE
Wrapper to release data by template.
Definition tls.hpp:216
void _cleanupTerminatedData()
Definition tls.hpp:201
Definition tls.hpp:26
virtual void * createDataInstance() const =0
void * getData() const
void detachData(std::vector< void * > &data)
get TLS data and detach all data from threads (similar to cleanup() call)
void gatherData(std::vector< void * > &data) const
void cleanup()
Release created TLS data container objects. It is similar to release() call, but it keeps TLS contain...
virtual void deleteDataInstance(void *pData) const =0
virtual ~TLSDataContainer()
Simple TLS data class.
Definition tls.hpp:64
void cleanup()
Release associated thread data.
Definition tls.hpp:73
virtual void deleteDataInstance(void *pData) const CV_OVERRIDE
Wrapper to release data by template.
Definition tls.hpp:82
virtual void * createDataInstance() const CV_OVERRIDE
Wrapper to allocate data by template.
Definition tls.hpp:80
~TLSData()
Definition tls.hpp:67
T & getRef() const
Get data associated with key.
Definition tls.hpp:70
TLSData()
Definition tls.hpp:66
T * get() const
Get data associated with key.
Definition tls.hpp:69
T clear(T... args)
T end(T... args)
InputArrayOfArrays InputArrayOfArrays InputOutputArray InputOutputArray InputOutputArray InputOutputArray Size InputOutputArray InputOutputArray T
Definition calib3d.hpp:1867
void * data
Definition core_c.h:427
#define CV_EXPORTS
Definition cvdef.h:435
#define CV_OVERRIDE
Definition cvdef.h:792
#define CV_Assert(expr)
Checks a condition at runtime and throws exception if it fails.
Definition base.hpp:342
#define CV_DbgAssert(expr)
Definition base.hpp:375
"black box" representation of the file storage associated with a file on disk.
Definition calib3d.hpp:441
T push_back(T... args)
T reserve(T... args)
T size(T... args)