Fixed build for the TLS-related stuff.
This commit is contained in:
parent
9d8d70d6ca
commit
f2befa01f4
@ -305,18 +305,18 @@ private:
|
||||
AutoLock& operator = (const AutoLock&);
|
||||
};
|
||||
|
||||
class TLSDataContainer
|
||||
class CV_EXPORTS TLSDataContainer
|
||||
{
|
||||
private:
|
||||
int key_;
|
||||
protected:
|
||||
CV_EXPORTS TLSDataContainer();
|
||||
CV_EXPORTS ~TLSDataContainer(); // virtual is not required
|
||||
TLSDataContainer();
|
||||
virtual ~TLSDataContainer();
|
||||
public:
|
||||
virtual void* createDataInstance() const = 0;
|
||||
virtual void deleteDataInstance(void* data) const = 0;
|
||||
|
||||
CV_EXPORTS void* getData() const;
|
||||
void* getData() const;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
|
@ -1338,7 +1338,7 @@ bool haveOpenCL()
|
||||
|
||||
bool useOpenCL()
|
||||
{
|
||||
TLSData* data = TLSData::get();
|
||||
CoreTLSData* data = coreTlsData.get();
|
||||
if( data->useOpenCL < 0 )
|
||||
data->useOpenCL = (int)haveOpenCL();
|
||||
return data->useOpenCL > 0;
|
||||
@ -1348,7 +1348,7 @@ void setUseOpenCL(bool flag)
|
||||
{
|
||||
if( haveOpenCL() )
|
||||
{
|
||||
TLSData* data = TLSData::get();
|
||||
CoreTLSData* data = coreTlsData.get();
|
||||
data->useOpenCL = flag ? 1 : 0;
|
||||
}
|
||||
}
|
||||
@ -1765,7 +1765,7 @@ size_t Device::profilingTimerResolution() const
|
||||
const Device& Device::getDefault()
|
||||
{
|
||||
const Context2& ctx = Context2::getDefault();
|
||||
int idx = TLSData::get()->device;
|
||||
int idx = coreTlsData.get()->device;
|
||||
return ctx.device(idx);
|
||||
}
|
||||
|
||||
@ -2059,7 +2059,7 @@ void* Queue::ptr() const
|
||||
|
||||
Queue& Queue::getDefault()
|
||||
{
|
||||
Queue& q = TLSData::get()->oclQueue;
|
||||
Queue& q = coreTlsData.get()->oclQueue;
|
||||
if( !q.p && haveOpenCL() )
|
||||
q.create(Context2::getDefault());
|
||||
return q;
|
||||
|
@ -106,7 +106,6 @@ extern const uchar g_Saturate8u[];
|
||||
|
||||
#if defined WIN32 || defined _WIN32
|
||||
void deleteThreadAllocData();
|
||||
void deleteThreadData();
|
||||
#endif
|
||||
|
||||
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)
|
||||
|
||||
void convertAndUnrollScalar( const Mat& sc, int buftype, uchar* scbuf, size_t blocksize );
|
||||
|
||||
struct TLSData
|
||||
struct CoreTLSData
|
||||
{
|
||||
TLSData();
|
||||
CoreTLSData() : device(0), useOpenCL(-1)
|
||||
{}
|
||||
|
||||
RNG rng;
|
||||
int device;
|
||||
ocl::Queue oclQueue;
|
||||
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 WIN32 || defined _WIN32 || defined WINCE
|
||||
#define CL_RUNTIME_EXPORT __declspec(dllexport)
|
||||
|
@ -731,7 +731,7 @@ void RNG::fill( InputOutputArray _mat, int disttype,
|
||||
|
||||
cv::RNG& cv::theRNG()
|
||||
{
|
||||
return TLSData::get()->rng;
|
||||
return coreTlsData.get()->rng;
|
||||
}
|
||||
|
||||
void cv::randu(InputOutputArray dst, InputArray low, InputArray high)
|
||||
|
@ -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 lpReserved)
|
||||
{
|
||||
if (fdwReason == DLL_THREAD_DETACH || fdwReason == DLL_PROCESS_DETACH)
|
||||
{
|
||||
if (lpReserved != NULL) // called after ExitProcess() call
|
||||
cv::__termination = true;
|
||||
cv::deleteThreadAllocData();
|
||||
cv::deleteThreadRNGData();
|
||||
cv::deleteThreadData();
|
||||
}
|
||||
return TRUE;
|
||||
@ -1038,94 +1039,8 @@ TLSStorage::~TLSStorage()
|
||||
tlsData_.clear();
|
||||
}
|
||||
|
||||
TLSData<CoreTLSData> coreTlsData;
|
||||
|
||||
} // namespace cv
|
||||
|
||||
//////////////////////////////// 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()
|
||||
{
|
||||
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. */
|
||||
|
Loading…
x
Reference in New Issue
Block a user