Commit f2befa01 authored by Roman Donchenko's avatar Roman Donchenko

Fixed build for the TLS-related stuff.

parent 9d8d70d6
...@@ -305,18 +305,18 @@ private: ...@@ -305,18 +305,18 @@ private:
AutoLock& operator = (const AutoLock&); AutoLock& operator = (const AutoLock&);
}; };
class TLSDataContainer class CV_EXPORTS TLSDataContainer
{ {
private: private:
int key_; int key_;
protected: protected:
CV_EXPORTS TLSDataContainer(); TLSDataContainer();
CV_EXPORTS ~TLSDataContainer(); // virtual is not required virtual ~TLSDataContainer();
public: public:
virtual void* createDataInstance() const = 0; virtual void* createDataInstance() const = 0;
virtual void deleteDataInstance(void* data) const = 0; virtual void deleteDataInstance(void* data) const = 0;
CV_EXPORTS void* getData() const; void* getData() const;
}; };
template <typename T> template <typename T>
......
...@@ -1338,7 +1338,7 @@ bool haveOpenCL() ...@@ -1338,7 +1338,7 @@ bool haveOpenCL()
bool useOpenCL() bool useOpenCL()
{ {
TLSData* data = TLSData::get(); CoreTLSData* data = coreTlsData.get();
if( data->useOpenCL < 0 ) if( data->useOpenCL < 0 )
data->useOpenCL = (int)haveOpenCL(); data->useOpenCL = (int)haveOpenCL();
return data->useOpenCL > 0; return data->useOpenCL > 0;
...@@ -1348,7 +1348,7 @@ void setUseOpenCL(bool flag) ...@@ -1348,7 +1348,7 @@ void setUseOpenCL(bool flag)
{ {
if( haveOpenCL() ) if( haveOpenCL() )
{ {
TLSData* data = TLSData::get(); CoreTLSData* data = coreTlsData.get();
data->useOpenCL = flag ? 1 : 0; data->useOpenCL = flag ? 1 : 0;
} }
} }
...@@ -1765,7 +1765,7 @@ size_t Device::profilingTimerResolution() const ...@@ -1765,7 +1765,7 @@ size_t Device::profilingTimerResolution() const
const Device& Device::getDefault() const Device& Device::getDefault()
{ {
const Context2& ctx = Context2::getDefault(); const Context2& ctx = Context2::getDefault();
int idx = TLSData::get()->device; int idx = coreTlsData.get()->device;
return ctx.device(idx); return ctx.device(idx);
} }
...@@ -2059,7 +2059,7 @@ void* Queue::ptr() const ...@@ -2059,7 +2059,7 @@ void* Queue::ptr() const
Queue& Queue::getDefault() Queue& Queue::getDefault()
{ {
Queue& q = TLSData::get()->oclQueue; Queue& q = coreTlsData.get()->oclQueue;
if( !q.p && haveOpenCL() ) if( !q.p && haveOpenCL() )
q.create(Context2::getDefault()); q.create(Context2::getDefault());
return q; return q;
......
...@@ -106,7 +106,6 @@ extern const uchar g_Saturate8u[]; ...@@ -106,7 +106,6 @@ extern const uchar g_Saturate8u[];
#if defined WIN32 || defined _WIN32 #if defined WIN32 || defined _WIN32
void deleteThreadAllocData(); void deleteThreadAllocData();
void deleteThreadData();
#endif #endif
template<typename T1, typename T2=T1, typename T3=T1> struct OpAdd template<typename T1, typename T2=T1, typename T3=T1> struct OpAdd
...@@ -233,17 +232,19 @@ inline bool checkScalar(InputArray sc, int atype, int sckind, int akind) ...@@ -233,17 +232,19 @@ inline bool checkScalar(InputArray sc, int atype, int sckind, int akind)
void convertAndUnrollScalar( const Mat& sc, int buftype, uchar* scbuf, size_t blocksize ); void convertAndUnrollScalar( const Mat& sc, int buftype, uchar* scbuf, size_t blocksize );
struct TLSData struct CoreTLSData
{ {
TLSData(); CoreTLSData() : device(0), useOpenCL(-1)
{}
RNG rng; RNG rng;
int device; int device;
ocl::Queue oclQueue; ocl::Queue oclQueue;
int useOpenCL; // 1 - use, 0 - do not use, -1 - auto/not initialized int useOpenCL; // 1 - use, 0 - do not use, -1 - auto/not initialized
static TLSData* get();
}; };
extern TLSData<CoreTLSData> coreTlsData;
#if defined(BUILD_SHARED_LIBS) #if defined(BUILD_SHARED_LIBS)
#if defined WIN32 || defined _WIN32 || defined WINCE #if defined WIN32 || defined _WIN32 || defined WINCE
#define CL_RUNTIME_EXPORT __declspec(dllexport) #define CL_RUNTIME_EXPORT __declspec(dllexport)
......
...@@ -731,7 +731,7 @@ void RNG::fill( InputOutputArray _mat, int disttype, ...@@ -731,7 +731,7 @@ void RNG::fill( InputOutputArray _mat, int disttype,
cv::RNG& cv::theRNG() cv::RNG& cv::theRNG()
{ {
return TLSData::get()->rng; return coreTlsData.get()->rng;
} }
void cv::randu(InputOutputArray dst, InputArray low, InputArray high) void cv::randu(InputOutputArray dst, InputArray low, InputArray high)
......
...@@ -911,12 +911,13 @@ public: ...@@ -911,12 +911,13 @@ public:
BOOL WINAPI DllMain(HINSTANCE, DWORD fdwReason, LPVOID); BOOL WINAPI DllMain(HINSTANCE, DWORD fdwReason, LPVOID);
BOOL WINAPI DllMain(HINSTANCE, DWORD fdwReason, LPVOID) BOOL WINAPI DllMain(HINSTANCE, DWORD fdwReason, LPVOID lpReserved)
{ {
if (fdwReason == DLL_THREAD_DETACH || fdwReason == DLL_PROCESS_DETACH) if (fdwReason == DLL_THREAD_DETACH || fdwReason == DLL_PROCESS_DETACH)
{ {
if (lpReserved != NULL) // called after ExitProcess() call
cv::__termination = true;
cv::deleteThreadAllocData(); cv::deleteThreadAllocData();
cv::deleteThreadRNGData();
cv::deleteThreadData(); cv::deleteThreadData();
} }
return TRUE; return TRUE;
...@@ -1038,94 +1039,8 @@ TLSStorage::~TLSStorage() ...@@ -1038,94 +1039,8 @@ TLSStorage::~TLSStorage()
tlsData_.clear(); tlsData_.clear();
} }
} // namespace cv TLSData<CoreTLSData> coreTlsData;
//////////////////////////////// thread-local storage ////////////////////////////////
namespace cv
{
TLSData::TLSData()
{
device = 0;
useOpenCL = -1;
}
#ifdef WIN32
#ifdef HAVE_WINRT
// using C++11 thread attribute for local thread data
static __declspec( thread ) TLSData* g_tlsdata = NULL;
static void deleteThreadRNGData()
{
if (g_tlsdata)
delete g_tlsdata;
}
TLSData* TLSData::get()
{
if (!g_tlsdata)
{
g_tlsdata = new TLSData;
}
return g_tlsdata;
}
#else
#ifdef WINCE
# define TLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF)
#endif
static DWORD tlsKey = TLS_OUT_OF_INDEXES;
void deleteThreadData()
{
if( tlsKey != TLS_OUT_OF_INDEXES )
delete (TLSData*)TlsGetValue( tlsKey );
}
TLSData* TLSData::get() } // namespace cv
{
if( tlsKey == TLS_OUT_OF_INDEXES )
{
tlsKey = TlsAlloc();
CV_Assert(tlsKey != TLS_OUT_OF_INDEXES);
}
TLSData* d = (TLSData*)TlsGetValue( tlsKey );
if( !d )
{
d = new TLSData;
TlsSetValue( tlsKey, d );
}
return d;
}
#endif //HAVE_WINRT
#else
static pthread_key_t tlsKey = 0;
static pthread_once_t tlsKeyOnce = PTHREAD_ONCE_INIT;
static void deleteTLSData(void* data)
{
delete (TLSData*)data;
}
static void makeKey()
{
int errcode = pthread_key_create(&tlsKey, deleteTLSData);
CV_Assert(errcode == 0);
}
TLSData* TLSData::get()
{
pthread_once(&tlsKeyOnce, makeKey);
TLSData* d = (TLSData*)pthread_getspecific(tlsKey);
if( !d )
{
d = new TLSData;
pthread_setspecific(tlsKey, d);
}
return d;
}
#endif
}
/* End of file. */ /* End of file. */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment