1 /*
2     Copyright (c) 2005-2020 Intel Corporation
3 
4     Licensed under the Apache License, Version 2.0 (the "License");
5     you may not use this file except in compliance with the License.
6     You may obtain a copy of the License at
7 
8         http://www.apache.org/licenses/LICENSE-2.0
9 
10     Unless required by applicable law or agreed to in writing, software
11     distributed under the License is distributed on an "AS IS" BASIS,
12     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13     See the License for the specific language governing permissions and
14     limitations under the License.
15 */
16 
17 #include "tbb/tbb_config.h"
18 
19 // Include this header file before harness.h for HARNESS_SKIP_TEST to take effect
20 #if !__TBB_DYNAMIC_LOAD_ENABLED
21 #define HARNESS_SKIP_TEST 1
22 #else
23 
24 #if _WIN32 || _WIN64
25 #include "tbb/machine/windows_api.h"
26 #else
27 #include <dlfcn.h>
28 #endif
29 #include "harness_assert.h"
30 
31 namespace Harness {
32 
33 #if TBB_USE_DEBUG
34 #define SUFFIX1 "_debug"
35 #define SUFFIX2
36 #else
37 #define SUFFIX1
38 #define SUFFIX2 "_debug"
39 #endif /* TBB_USE_DEBUG */
40 
41 #if _WIN32||_WIN64
42 #define PREFIX
43 #define EXT ".dll"
44 #else
45 #define PREFIX "lib"
46 #if __APPLE__
47 #define EXT ".dylib"
48 // Android SDK build system does not support .so file name versioning
49 #elif __FreeBSD__ || __NetBSD__ || __sun || _AIX || __ANDROID__
50 #define EXT ".so"
51 #elif __linux__  // Order of these elif's matters!
52 #define EXT __TBB_STRING(.so.TBB_COMPATIBLE_INTERFACE_VERSION)
53 #else
54 #error Unknown OS
55 #endif
56 #endif
57 
58 // Form the names of the TBB memory allocator binaries.
59 #define MALLOCLIB_NAME1 PREFIX "tbbmalloc" SUFFIX1 EXT
60 #define MALLOCLIB_NAME2 PREFIX "tbbmalloc" SUFFIX2 EXT
61 
62 #if _WIN32 || _WIN64
63 typedef  HMODULE LIBRARY_HANDLE;
64 #else
65 typedef void *LIBRARY_HANDLE;
66 #endif
67 
68 #if _WIN32 || _WIN64
69 #define TEST_LIBRARY_NAME(base) base".dll"
70 #elif __APPLE__
71 #define TEST_LIBRARY_NAME(base) base".dylib"
72 #else
73 #define TEST_LIBRARY_NAME(base) base".so"
74 #endif
75 
OpenLibrary(const char * name)76 LIBRARY_HANDLE OpenLibrary(const char *name)
77 {
78 #if _WIN32 || _WIN64
79 #if __TBB_WIN8UI_SUPPORT
80     TCHAR wlibrary[MAX_PATH];
81     if ( MultiByteToWideChar(CP_UTF8, 0, name, -1, wlibrary, MAX_PATH) == 0 ) return false;
82     return :: LoadPackagedLibrary( wlibrary, 0 );
83 #else
84     return ::LoadLibrary(name);
85 #endif
86 #else
87     return dlopen(name, RTLD_NOW|RTLD_GLOBAL);
88 #endif
89 }
90 
CloseLibrary(LIBRARY_HANDLE lib)91 void CloseLibrary(LIBRARY_HANDLE lib)
92 {
93 #if _WIN32 || _WIN64
94     BOOL ret = FreeLibrary(lib);
95     ASSERT(ret, "FreeLibrary must be successful");
96 #else
97     int ret = dlclose(lib);
98     ASSERT(ret == 0, "dlclose must be successful");
99 #endif
100 }
101 
102 typedef void (*FunctionAddress)();
103 
104 template <typename FunctionPointer>
GetAddress(Harness::LIBRARY_HANDLE lib,const char * name,FunctionPointer & func)105 void GetAddress(Harness::LIBRARY_HANDLE lib, const char *name, FunctionPointer& func)
106 {
107 #if _WIN32 || _WIN64
108     func = (FunctionPointer)(void*)GetProcAddress(lib, name);
109 #else
110     func = (FunctionPointer)dlsym(lib, name);
111 #endif
112     ASSERT(func, "Can't find required symbol in dynamic library");
113 }
114 
GetAddress(Harness::LIBRARY_HANDLE lib,const char * name)115 FunctionAddress GetAddress(Harness::LIBRARY_HANDLE lib, const char *name)
116 {
117     FunctionAddress func;
118     GetAddress(lib, name, func);
119     return func;
120 }
121 
122 }  // namespace Harness
123 
124 #endif // __TBB_DYNAMIC_LOAD_ENABLED
125