aboutsummaryrefslogtreecommitdiff
path: root/src/backends/backendsCommon/DynamicBackendUtils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/backends/backendsCommon/DynamicBackendUtils.cpp')
-rw-r--r--src/backends/backendsCommon/DynamicBackendUtils.cpp92
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