IVGCVSW-3543 Implement the backend versioning algorithm
[platform/upstream/armnn.git] / src / backends / backendsCommon / DynamicBackendUtils.cpp
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5
6 #include "DynamicBackendUtils.hpp"
7
8 namespace armnn
9 {
10
11 void* DynamicBackendUtils::OpenHandle(const std::string& sharedObjectPath)
12 {
13     if (sharedObjectPath.empty())
14     {
15         throw RuntimeException("OpenHandle error: shared object path must not be empty");
16     }
17
18     void* sharedObjectHandle = dlopen(sharedObjectPath.c_str(), RTLD_LAZY | RTLD_GLOBAL);
19     if (!sharedObjectHandle)
20     {
21         throw RuntimeException(boost::str(boost::format("OpenHandle error: %1%") % GetDlError()));
22     }
23
24     return sharedObjectHandle;
25 }
26
27 void DynamicBackendUtils::CloseHandle(const void* sharedObjectHandle)
28 {
29     if (!sharedObjectHandle)
30     {
31         return;
32     }
33
34     dlclose(const_cast<void*>(sharedObjectHandle));
35 }
36
37 bool DynamicBackendUtils::IsBackendCompatible(const BackendVersion &backendVersion)
38 {
39     BackendVersion backendApiVersion = IBackendInternal::GetApiVersion();
40
41     return IsBackendCompatibleImpl(backendApiVersion, backendVersion);
42 }
43
44 bool DynamicBackendUtils::IsBackendCompatibleImpl(const BackendVersion &backendApiVersion,
45                                                   const BackendVersion &backendVersion)
46 {
47     return backendVersion.m_Major == backendApiVersion.m_Major &&
48            backendVersion.m_Minor <= backendApiVersion.m_Minor;
49 }
50
51 std::string DynamicBackendUtils::GetDlError()
52 {
53     const char* errorMessage = dlerror();
54     if (!errorMessage)
55     {
56         return "";
57     }
58
59     return std::string(errorMessage);
60 }
61
62 } // namespace armnn