Merge pull request #6057 from alalek:fix_opencl_load_threadsafe

This commit is contained in:
Vadim Pisarevsky 2016-02-04 09:31:35 +00:00
commit dabce70325

View File

@ -58,11 +58,11 @@ static void* AppleCLGetProcAddress(const char* name)
{ {
static bool initialized = false; static bool initialized = false;
static void* handle = NULL; static void* handle = NULL;
if (!handle) if (!handle && !initialized)
{ {
cv::AutoLock lock(cv::getInitializationMutex());
if (!initialized) if (!initialized)
{ {
initialized = true;
const char* path = "/System/Library/Frameworks/OpenCL.framework/Versions/Current/OpenCL"; const char* path = "/System/Library/Frameworks/OpenCL.framework/Versions/Current/OpenCL";
const char* envPath = getenv("OPENCV_OPENCL_RUNTIME"); const char* envPath = getenv("OPENCV_OPENCL_RUNTIME");
if (envPath) if (envPath)
@ -78,10 +78,11 @@ static void* AppleCLGetProcAddress(const char* name)
fprintf(stderr, ERROR_MSG_INVALID_VERSION); fprintf(stderr, ERROR_MSG_INVALID_VERSION);
handle = NULL; handle = NULL;
} }
initialized = true;
}
} }
if (!handle) if (!handle)
return NULL; return NULL;
}
return dlsym(handle, name); return dlsym(handle, name);
} }
#define CV_CL_GET_PROC_ADDRESS(name) AppleCLGetProcAddress(name) #define CV_CL_GET_PROC_ADDRESS(name) AppleCLGetProcAddress(name)
@ -94,11 +95,11 @@ static void* WinGetProcAddress(const char* name)
{ {
static bool initialized = false; static bool initialized = false;
static HMODULE handle = NULL; static HMODULE handle = NULL;
if (!handle) if (!handle && !initialized)
{ {
cv::AutoLock lock(cv::getInitializationMutex());
if (!initialized) if (!initialized)
{ {
initialized = true;
handle = GetModuleHandleA("OpenCL.dll"); handle = GetModuleHandleA("OpenCL.dll");
if (!handle) if (!handle)
{ {
@ -118,10 +119,11 @@ static void* WinGetProcAddress(const char* name)
handle = NULL; handle = NULL;
} }
} }
initialized = true;
}
} }
if (!handle) if (!handle)
return NULL; return NULL;
}
return (void*)GetProcAddress(handle, name); return (void*)GetProcAddress(handle, name);
} }
#define CV_CL_GET_PROC_ADDRESS(name) WinGetProcAddress(name) #define CV_CL_GET_PROC_ADDRESS(name) WinGetProcAddress(name)
@ -135,11 +137,11 @@ static void* GetProcAddress(const char* name)
{ {
static bool initialized = false; static bool initialized = false;
static void* handle = NULL; static void* handle = NULL;
if (!handle) if (!handle && !initialized)
{ {
cv::AutoLock lock(cv::getInitializationMutex());
if (!initialized) if (!initialized)
{ {
initialized = true;
const char* path = "libOpenCL.so"; const char* path = "libOpenCL.so";
const char* envPath = getenv("OPENCV_OPENCL_RUNTIME"); const char* envPath = getenv("OPENCV_OPENCL_RUNTIME");
if (envPath) if (envPath)
@ -155,10 +157,11 @@ static void* GetProcAddress(const char* name)
fprintf(stderr, ERROR_MSG_INVALID_VERSION); fprintf(stderr, ERROR_MSG_INVALID_VERSION);
handle = NULL; handle = NULL;
} }
initialized = true;
}
} }
if (!handle) if (!handle)
return NULL; return NULL;
}
return dlsym(handle, name); return dlsym(handle, name);
} }
#define CV_CL_GET_PROC_ADDRESS(name) GetProcAddress(name) #define CV_CL_GET_PROC_ADDRESS(name) GetProcAddress(name)