diff --git a/modules/ocl/src/cl_context.cpp b/modules/ocl/src/cl_context.cpp index 15b5265a1f..ef9611d9b2 100644 --- a/modules/ocl/src/cl_context.cpp +++ b/modules/ocl/src/cl_context.cpp @@ -189,11 +189,8 @@ static bool parseOpenCLDeviceConfiguration(const std::string& configurationStr, return true; } -static bool __deviceSelected = false; static bool selectOpenCLDevice() { - __deviceSelected = true; - std::string platform; std::vector deviceTypes; std::string deviceName; @@ -528,26 +525,38 @@ private: static ContextImpl* currentContext = NULL; +static bool __deviceSelected = false; + Context* Context::getContext() { if (currentContext == NULL) { - if (!__initialized || !__deviceSelected) + static bool defaultInitiaization = false; + if (!defaultInitiaization) { cv::AutoLock lock(getInitializationMutex()); - if (!__initialized) + try { - if (initializeOpenCLDevices() == 0) + if (!__initialized) { - CV_Error(CV_OpenCLInitError, "OpenCL not available"); + if (initializeOpenCLDevices() == 0) + { + CV_Error(CV_OpenCLInitError, "OpenCL not available"); + } } + if (!__deviceSelected) + { + if (!selectOpenCLDevice()) + { + CV_Error(CV_OpenCLInitError, "Can't select OpenCL device"); + } + } + defaultInitiaization = true; } - if (!__deviceSelected) + catch (...) { - if (!selectOpenCLDevice()) - { - CV_Error(CV_OpenCLInitError, "Can't select OpenCL device"); - } + defaultInitiaization = true; + throw; } } CV_Assert(currentContext != NULL); @@ -741,10 +750,16 @@ int getOpenCLDevices(std::vector &devices, int deviceType, co void setDevice(const DeviceInfo* info) { - if (!__deviceSelected) + try + { + ContextImpl::setContext(info); __deviceSelected = true; - - ContextImpl::setContext(info); + } + catch (...) + { + __deviceSelected = true; + throw; + } } bool supportsFeature(FEATURE_TYPE featureType) diff --git a/modules/ocl/src/cl_operations.cpp b/modules/ocl/src/cl_operations.cpp index 7ed1a79c8d..032ebe82a4 100644 --- a/modules/ocl/src/cl_operations.cpp +++ b/modules/ocl/src/cl_operations.cpp @@ -192,6 +192,7 @@ void openCLMallocPitchEx(Context *ctx, void **dev_ptr, size_t *pitch, clFinish(getClCommandQueue(ctx)); #endif CheckBuffers data(mainBuffer, size, widthInBytes, height); + cv::AutoLock lock(getInitializationMutex()); __check_buffers.insert(std::pair((cl_mem)*dev_ptr, data)); } #endif @@ -253,10 +254,17 @@ void openCLFree(void *devPtr) bool failBefore = false, failAfter = false; #endif CheckBuffers data; - std::map::iterator i = __check_buffers.find((cl_mem)devPtr); - if (i != __check_buffers.end()) { - data = i->second; + cv::AutoLock lock(getInitializationMutex()); + std::map::iterator i = __check_buffers.find((cl_mem)devPtr); + if (i != __check_buffers.end()) + { + data = i->second; + __check_buffers.erase(i); + } + } + if (data.mainBuffer != NULL) + { #ifdef CHECK_MEMORY_CORRUPTION Context* ctx = Context::getContext(); std::vector checkBefore(__memory_corruption_guard_bytes); @@ -286,7 +294,6 @@ void openCLFree(void *devPtr) clFinish(getClCommandQueue(ctx)); #endif openCLSafeCall(clReleaseMemObject(data.mainBuffer)); - __check_buffers.erase(i); } #if defined(CHECK_MEMORY_CORRUPTION) if (failBefore)