From 594a93316ce9c8b90612659d169363460f9ba80d Mon Sep 17 00:00:00 2001 From: Maksim Shabunin Date: Fri, 12 Jan 2018 19:03:16 +0300 Subject: [PATCH] Fixed concurrent OpenCL cache folder name generation --- modules/core/src/ocl.cpp | 50 ++++++++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index 58fc0fe..3f580f4 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -2072,19 +2072,23 @@ struct Context::Impl { if (prefix.empty()) { - CV_Assert(!devices.empty()); - const Device& d = devices[0]; - int bits = d.addressBits(); - if (bits > 0 && bits != 64) - prefix = cv::format("%d-bit--", bits); - prefix += d.vendorName() + "--" + d.name() + "--" + d.driverVersion(); - // sanitize chars - for (size_t i = 0; i < prefix.size(); i++) + cv::AutoLock lock(program_cache_mutex); + if (prefix.empty()) { - char c = prefix[i]; - if (!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_' || c == '-')) + CV_Assert(!devices.empty()); + const Device& d = devices[0]; + int bits = d.addressBits(); + if (bits > 0 && bits != 64) + prefix = cv::format("%d-bit--", bits); + prefix += d.vendorName() + "--" + d.name() + "--" + d.driverVersion(); + // sanitize chars + for (size_t i = 0; i < prefix.size(); i++) { - prefix[i] = '_'; + char c = prefix[i]; + if (!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_' || c == '-')) + { + prefix[i] = '_'; + } } } } @@ -2095,18 +2099,22 @@ struct Context::Impl { if (prefix_base.empty()) { - const Device& d = devices[0]; - int bits = d.addressBits(); - if (bits > 0 && bits != 64) - prefix_base = cv::format("%d-bit--", bits); - prefix_base += d.vendorName() + "--" + d.name() + "--"; - // sanitize chars - for (size_t i = 0; i < prefix_base.size(); i++) + cv::AutoLock lock(program_cache_mutex); + if (prefix_base.empty()) { - char c = prefix_base[i]; - if (!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_' || c == '-')) + const Device& d = devices[0]; + int bits = d.addressBits(); + if (bits > 0 && bits != 64) + prefix_base = cv::format("%d-bit--", bits); + prefix_base += d.vendorName() + "--" + d.name() + "--"; + // sanitize chars + for (size_t i = 0; i < prefix_base.size(); i++) { - prefix_base[i] = '_'; + char c = prefix_base[i]; + if (!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_' || c == '-')) + { + prefix_base[i] = '_'; + } } } } -- 2.7.4