From d650efc069b1dad37497712d0c4d0a3defc18149 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Fri, 22 Nov 2013 14:38:12 +0400 Subject: [PATCH] ocl: multi-threading: opencl buffer memory guard --- modules/ocl/src/cl_operations.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) 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) -- 2.34.1