ocl: fix cleanup in static builds
This commit is contained in:
parent
57120c1a60
commit
ce1177151e
@ -77,6 +77,8 @@ inline cl_command_queue getClCommandQueue(const Context *ctx)
|
||||
return *(cl_command_queue*)(ctx->getOpenCLCommandQueuePtr());
|
||||
}
|
||||
|
||||
CV_EXPORTS cv::Mutex& getInitializationMutex();
|
||||
|
||||
enum openCLMemcpyKind
|
||||
{
|
||||
clMemcpyHostToDevice = 0,
|
||||
|
@ -55,6 +55,21 @@
|
||||
namespace cv {
|
||||
namespace ocl {
|
||||
|
||||
struct __Module
|
||||
{
|
||||
__Module();
|
||||
~__Module();
|
||||
cv::Mutex initializationMutex;
|
||||
cv::Mutex currentContextMutex;
|
||||
};
|
||||
static __Module __module;
|
||||
|
||||
cv::Mutex& getInitializationMutex()
|
||||
{
|
||||
return __module.initializationMutex;
|
||||
}
|
||||
|
||||
|
||||
struct PlatformInfoImpl
|
||||
{
|
||||
cl_platform_id platform_id;
|
||||
@ -312,7 +327,6 @@ not_found:
|
||||
return false;
|
||||
}
|
||||
|
||||
static cv::Mutex __initializedMutex;
|
||||
static bool __initialized = false;
|
||||
static int initializeOpenCLDevices()
|
||||
{
|
||||
@ -499,7 +513,6 @@ private:
|
||||
ContextImpl& operator=(const ContextImpl&); // disabled
|
||||
};
|
||||
|
||||
static cv::Mutex currentContextMutex;
|
||||
static ContextImpl* currentContext = NULL;
|
||||
|
||||
Context* Context::getContext()
|
||||
@ -508,7 +521,7 @@ Context* Context::getContext()
|
||||
{
|
||||
if (!__initialized || !__deviceSelected)
|
||||
{
|
||||
cv::AutoLock lock(__initializedMutex);
|
||||
cv::AutoLock lock(getInitializationMutex());
|
||||
if (!__initialized)
|
||||
{
|
||||
if (initializeOpenCLDevices() == 0)
|
||||
@ -604,7 +617,7 @@ void ContextImpl::cleanupContext(void)
|
||||
fft_teardown();
|
||||
clBlasTeardown();
|
||||
|
||||
cv::AutoLock lock(currentContextMutex);
|
||||
cv::AutoLock lock(__module.currentContextMutex);
|
||||
if (currentContext)
|
||||
delete currentContext;
|
||||
currentContext = NULL;
|
||||
@ -615,7 +628,7 @@ void ContextImpl::setContext(const DeviceInfo* deviceInfo)
|
||||
CV_Assert(deviceInfo->_id >= 0 && deviceInfo->_id < (int)global_devices.size());
|
||||
|
||||
{
|
||||
cv::AutoLock lock(currentContextMutex);
|
||||
cv::AutoLock lock(__module.currentContextMutex);
|
||||
if (currentContext)
|
||||
{
|
||||
if (currentContext->deviceInfo._id == deviceInfo->_id)
|
||||
@ -640,7 +653,7 @@ void ContextImpl::setContext(const DeviceInfo* deviceInfo)
|
||||
|
||||
ContextImpl* old = NULL;
|
||||
{
|
||||
cv::AutoLock lock(currentContextMutex);
|
||||
cv::AutoLock lock(__module.currentContextMutex);
|
||||
old = currentContext;
|
||||
currentContext = ctx;
|
||||
}
|
||||
@ -724,20 +737,19 @@ bool supportsFeature(FEATURE_TYPE featureType)
|
||||
return Context::getContext()->supportsFeature(featureType);
|
||||
}
|
||||
|
||||
struct __Module
|
||||
__Module::__Module()
|
||||
{
|
||||
__Module() { /* moved to Context::getContext(): initializeOpenCLDevices(); */ }
|
||||
~__Module()
|
||||
{
|
||||
#if defined(WIN32) && defined(CVAPI_EXPORTS)
|
||||
// nothing, see DllMain
|
||||
#else
|
||||
ContextImpl::cleanupContext();
|
||||
#endif
|
||||
}
|
||||
};
|
||||
static __Module __module;
|
||||
/* moved to Context::getContext(): initializeOpenCLDevices(); */
|
||||
}
|
||||
|
||||
__Module::~__Module()
|
||||
{
|
||||
#if defined(WIN32) && defined(CVAPI_EXPORTS)
|
||||
// nothing, see DllMain
|
||||
#else
|
||||
ContextImpl::cleanupContext();
|
||||
#endif
|
||||
}
|
||||
|
||||
} // namespace ocl
|
||||
} // namespace cv
|
||||
|
@ -90,8 +90,7 @@ namespace cv
|
||||
protected:
|
||||
PlanCache();
|
||||
~PlanCache();
|
||||
friend class auto_ptr<PlanCache>;
|
||||
static auto_ptr<PlanCache> planCache;
|
||||
static PlanCache* planCache;
|
||||
|
||||
bool started;
|
||||
vector<FftPlan *> planStore;
|
||||
@ -102,9 +101,9 @@ namespace cv
|
||||
|
||||
static PlanCache* getPlanCache()
|
||||
{
|
||||
if( NULL == planCache.get())
|
||||
planCache.reset(new PlanCache());
|
||||
return planCache.get();
|
||||
if (NULL == planCache)
|
||||
planCache = new PlanCache();
|
||||
return planCache;
|
||||
}
|
||||
// return a baked plan->
|
||||
// if there is one matched plan, return it
|
||||
@ -118,7 +117,7 @@ namespace cv
|
||||
};
|
||||
}
|
||||
}
|
||||
auto_ptr<PlanCache> PlanCache::planCache;
|
||||
PlanCache* PlanCache::planCache = NULL;
|
||||
|
||||
void cv::ocl::fft_setup()
|
||||
{
|
||||
@ -138,13 +137,13 @@ void cv::ocl::fft_teardown()
|
||||
{
|
||||
return;
|
||||
}
|
||||
delete pCache.setupData;
|
||||
for(size_t i = 0; i < pCache.planStore.size(); i ++)
|
||||
{
|
||||
delete pCache.planStore[i];
|
||||
}
|
||||
pCache.planStore.clear();
|
||||
openCLSafeCall( clAmdFftTeardown( ) );
|
||||
delete pCache.setupData; pCache.setupData = NULL;
|
||||
pCache.started = false;
|
||||
}
|
||||
|
||||
|
@ -76,13 +76,12 @@ void cv::ocl::clBlasTeardown()
|
||||
using namespace cv;
|
||||
|
||||
static bool clBlasInitialized = false;
|
||||
static Mutex cs;
|
||||
|
||||
void cv::ocl::clBlasSetup()
|
||||
{
|
||||
if(!clBlasInitialized)
|
||||
{
|
||||
AutoLock al(cs);
|
||||
AutoLock lock(getInitializationMutex());
|
||||
if(!clBlasInitialized)
|
||||
{
|
||||
openCLSafeCall(clAmdBlasSetup());
|
||||
@ -93,7 +92,7 @@ void cv::ocl::clBlasSetup()
|
||||
|
||||
void cv::ocl::clBlasTeardown()
|
||||
{
|
||||
AutoLock al(cs);
|
||||
AutoLock lock(getInitializationMutex());
|
||||
if(clBlasInitialized)
|
||||
{
|
||||
clAmdBlasTeardown();
|
||||
|
Loading…
x
Reference in New Issue
Block a user