diff --git a/projects/clr/opencl/api/opencl/khronos/icd/icd.c b/projects/clr/opencl/api/opencl/khronos/icd/icd.c index fbb3120363..8405e5a5ab 100644 --- a/projects/clr/opencl/api/opencl/khronos/icd/icd.c +++ b/projects/clr/opencl/api/opencl/khronos/icd/icd.c @@ -75,6 +75,17 @@ void khrIcdVendorAdd(const char *libraryName) goto Done; } + // get the library's file name + const char *libName = libraryName; + const char *c; + for (c = libraryName; *c; ++c) + { + if ((*c == '\\') || (*c == '/')) + { + libName = c + 1; + } + } + // ensure that we haven't already loaded this vendor for (vendorIterator = khrIcdVendors; vendorIterator; vendorIterator = vendorIterator->next) { @@ -83,6 +94,11 @@ void khrIcdVendorAdd(const char *libraryName) KHR_ICD_TRACE("already loaded vendor %s, nothing to do here\n", libraryName); goto Done; } + if (!strcmp(vendorIterator->libName, libName)) + { + KHR_ICD_TRACE("already loaded library %s, nothing to do here\n", libName); + goto Done; + } } // get the library's clGetExtensionFunctionAddress pointer @@ -180,6 +196,8 @@ void khrIcdVendorAdd(const char *libraryName) KHR_ICD_TRACE("failed get platform handle to library\n"); continue; } + vendor->libName = (char *)malloc(strlen(libName) + 1); + strcpy(vendor->libName, libName); vendor->clGetExtensionFunctionAddress = p_clGetExtensionFunctionAddress; vendor->platform = platforms[i]; vendor->suffix = suffix; diff --git a/projects/clr/opencl/api/opencl/khronos/icd/icd.h b/projects/clr/opencl/api/opencl/khronos/icd/icd.h index 9221be4709..bb8a985dab 100644 --- a/projects/clr/opencl/api/opencl/khronos/icd/icd.h +++ b/projects/clr/opencl/api/opencl/khronos/icd/icd.h @@ -88,6 +88,9 @@ struct KHRicdVendorRec // the loaded library object (true type varies on Linux versus Windows) void *library; + // the file name of the library + char *libName; + // the extension suffix for this platform char *suffix; diff --git a/projects/clr/opencl/api/opencl/khronos/icd/icd_linux.c b/projects/clr/opencl/api/opencl/khronos/icd/icd_linux.c index 31097f5978..b5f2959d9d 100644 --- a/projects/clr/opencl/api/opencl/khronos/icd/icd_linux.c +++ b/projects/clr/opencl/api/opencl/khronos/icd/icd_linux.c @@ -160,6 +160,16 @@ Cleanup: { closedir(dir); } + + KHRicdVendor *vendorIterator; + for (vendorIterator = khrIcdVendors; vendorIterator; vendorIterator = vendorIterator->next) + { + if (vendorIterator->libName != NULL) + { + free(vendorIterator->libName); + vendorIterator->libName = NULL; + } + } } // go through the list of vendors only once diff --git a/projects/clr/opencl/api/opencl/khronos/icd/icd_windows.c b/projects/clr/opencl/api/opencl/khronos/icd/icd_windows.c index ccdf99ccbd..93f9df8ac0 100644 --- a/projects/clr/opencl/api/opencl/khronos/icd/icd_windows.c +++ b/projects/clr/opencl/api/opencl/khronos/icd/icd_windows.c @@ -130,7 +130,17 @@ BOOL CALLBACK khrIcdOsVendorsEnumerate(PINIT_ONCE InitOnce, PVOID Parameter, PVO { KHR_ICD_TRACE("Failed to close platforms key %s, ignoring\n", platformsName); } - + + KHRicdVendor *vendorIterator; + for (vendorIterator = khrIcdVendors; vendorIterator; vendorIterator = vendorIterator->next) + { + if (vendorIterator->libName != NULL) + { + free(vendorIterator->libName); + vendorIterator->libName = NULL; + } + } + return TRUE; }