diff options
Diffstat (limited to 'src/backends/backendsCommon/DynamicBackendUtils.cpp')
-rw-r--r-- | src/backends/backendsCommon/DynamicBackendUtils.cpp | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/src/backends/backendsCommon/DynamicBackendUtils.cpp b/src/backends/backendsCommon/DynamicBackendUtils.cpp index 0ab02d7c98..ae36a24b30 100644 --- a/src/backends/backendsCommon/DynamicBackendUtils.cpp +++ b/src/backends/backendsCommon/DynamicBackendUtils.cpp @@ -5,6 +5,10 @@ #include "DynamicBackendUtils.hpp" +#include <boost/filesystem/operations.hpp> +#include <boost/algorithm/string.hpp> +#include <boost/log/trivial.hpp> + namespace armnn { @@ -59,4 +63,92 @@ std::string DynamicBackendUtils::GetDlError() return std::string(errorMessage); } +std::vector<std::string> DynamicBackendUtils::GetBackendPaths(const std::string& overrideBackendPath) +{ + // Check if a path where to dynamically load the backends from is given + if (!overrideBackendPath.empty()) + { + if (!IsPathValid(overrideBackendPath)) + { + BOOST_LOG_TRIVIAL(warning) << "WARNING: The given override path for dynamic backends \"" + << overrideBackendPath << "\" is not valid"; + + return {}; + } + + return std::vector<std::string>{ overrideBackendPath }; + } + + // Expects a colon-separated list: DYNAMIC_BACKEND_PATHS="PATH_1:PATH_2:...:PATH_N" + const std::string backendPaths = DYNAMIC_BACKEND_PATHS; + + return GetBackendPathsImpl(backendPaths); +} + +std::vector<std::string> DynamicBackendUtils::GetBackendPathsImpl(const std::string& backendPaths) +{ + std::unordered_set<std::string> uniqueBackendPaths; + std::vector<std::string> tempBackendPaths; + std::vector<std::string> validBackendPaths; + + // Split the given list of paths + boost::split(tempBackendPaths, backendPaths, boost::is_any_of(":")); + + for (const std::string& path : tempBackendPaths) + { + // Check whether the path is valid + if (!IsPathValid(path)) + { + continue; + } + + // Check whether the path is a duplicate + auto it = uniqueBackendPaths.find(path); + if (it != uniqueBackendPaths.end()) + { + // The path is a duplicate + continue; + } + + // Add the path to the set of unique paths + uniqueBackendPaths.insert(path); + + // Add the path to the list of valid paths + validBackendPaths.push_back(path); + } + + return validBackendPaths; +} + +bool DynamicBackendUtils::IsPathValid(const std::string& path) +{ + if (path.empty()) + { + BOOST_LOG_TRIVIAL(warning) << "WARNING: The given backend path is empty"; + return false; + } + + boost::filesystem::path boostPath(path); + + if (!boost::filesystem::exists(boostPath)) + { + BOOST_LOG_TRIVIAL(warning) << "WARNING: The given backend path \"" << path << "\" does not exist"; + return false; + } + + if (!boost::filesystem::is_directory(boostPath)) + { + BOOST_LOG_TRIVIAL(warning) << "WARNING: The given backend path \"" << path << "\" is not a directory"; + return false; + } + + if (!boostPath.is_absolute()) + { + BOOST_LOG_TRIVIAL(warning) << "WARNING: The given backend path \"" << path << "\" is not absolute"; + return false; + } + + return true; +} + } // namespace armnn |