ocl: fix cleanup in static builds

This commit is contained in:
Alexander Alekhin 2013-10-11 16:39:26 +04:00
parent 57120c1a60
commit ce1177151e
4 changed files with 40 additions and 28 deletions

View File

@ -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,

View File

@ -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

View File

@ -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;
}

View File

@ -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();