diff --git a/modules/ocl/include/opencv2/ocl/private/util.hpp b/modules/ocl/include/opencv2/ocl/private/util.hpp index 59e1d05094..253016405d 100644 --- a/modules/ocl/include/opencv2/ocl/private/util.hpp +++ b/modules/ocl/include/opencv2/ocl/private/util.hpp @@ -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, diff --git a/modules/ocl/src/cl_context.cpp b/modules/ocl/src/cl_context.cpp index 8a5f09a57a..258ed91e51 100644 --- a/modules/ocl/src/cl_context.cpp +++ b/modules/ocl/src/cl_context.cpp @@ -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() +{ + /* moved to Context::getContext(): initializeOpenCLDevices(); */ +} + +__Module::~__Module() { - __Module() { /* moved to Context::getContext(): initializeOpenCLDevices(); */ } - ~__Module() - { #if defined(WIN32) && defined(CVAPI_EXPORTS) - // nothing, see DllMain + // nothing, see DllMain #else - ContextImpl::cleanupContext(); + ContextImpl::cleanupContext(); #endif - } -}; -static __Module __module; - +} } // namespace ocl } // namespace cv diff --git a/modules/ocl/src/fft.cpp b/modules/ocl/src/fft.cpp index 93029bc85f..abaa0f5002 100644 --- a/modules/ocl/src/fft.cpp +++ b/modules/ocl/src/fft.cpp @@ -90,8 +90,7 @@ namespace cv protected: PlanCache(); ~PlanCache(); - friend class auto_ptr; - static auto_ptr planCache; + static PlanCache* planCache; bool started; vector 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 = 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; } diff --git a/modules/ocl/src/gemm.cpp b/modules/ocl/src/gemm.cpp index bd3e7e5b8f..89f148ffb4 100644 --- a/modules/ocl/src/gemm.cpp +++ b/modules/ocl/src/gemm.cpp @@ -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();