8
8
*/
9
9
10
10
#include <assert.h>
11
- #include <dlfcn.h>
12
- #include <pthread.h>
13
11
#include <stdbool.h>
14
12
#include <stdint.h>
15
13
#include <stdio.h>
@@ -52,7 +50,11 @@ typedef struct tbb_callbacks_t {
52
50
bool (* pool_destroy )(void * );
53
51
void * (* pool_identify )(void * object );
54
52
size_t (* pool_msize )(void * , void * );
53
+ #ifdef _WIN32
54
+ HMODULE lib_handle ;
55
+ #else
55
56
void * lib_handle ;
57
+ #endif
56
58
} tbb_callbacks_t ;
57
59
58
60
typedef struct tbb_memory_pool_t {
@@ -61,42 +63,79 @@ typedef struct tbb_memory_pool_t {
61
63
tbb_callbacks_t tbb_callbacks ;
62
64
} tbb_memory_pool_t ;
63
65
66
+ typedef enum tbb_enums_t {
67
+ TBB_LIB_NAME = 0 ,
68
+ TBB_POOL_MALLOC ,
69
+ TBB_POOL_REALLOC ,
70
+ TBB_POOL_ALIGNED_MALLOC ,
71
+ TBB_POOL_FREE ,
72
+ TBB_POOL_CREATE_V1 ,
73
+ TBB_POOL_DESTROY ,
74
+ TBB_POOL_IDENTIFY ,
75
+ TBB_POOL_MSIZE ,
76
+ TBB_POOL_SYMBOLS_MAX // it has to be the last one
77
+ } tbb_enums_t ;
78
+
79
+ static const char * tbb_symbol [TBB_POOL_SYMBOLS_MAX ] = {
80
+ #ifdef _WIN32
81
+ // symbols copied from oneTBB/src/tbbmalloc/def/win64-tbbmalloc.def
82
+ "tbbmalloc.dll" ,
83
+ "?pool_malloc@rml@@YAPEAXPEAVMemoryPool@1@_K@Z" ,
84
+ "?pool_realloc@rml@@YAPEAXPEAVMemoryPool@1@PEAX_K@Z" ,
85
+ "?pool_aligned_malloc@rml@@YAPEAXPEAVMemoryPool@1@_K1@Z" ,
86
+ "?pool_free@rml@@YA_NPEAVMemoryPool@1@PEAX@Z" ,
87
+ "?pool_create_v1@rml@@YA?AW4MemPoolError@1@_JPEBUMemPoolPolicy@1@"
88
+ "PEAPEAVMemoryPool@1@@Z" ,
89
+ "?pool_destroy@rml@@YA_NPEAVMemoryPool@1@@Z" ,
90
+ "?pool_identify@rml@@YAPEAVMemoryPool@1@PEAX@Z" ,
91
+ "?pool_msize@rml@@YA_KPEAVMemoryPool@1@PEAX@Z"
92
+ #else
93
+ // symbols copied from oneTBB/src/tbbmalloc/def/lin64-tbbmalloc.def
94
+ "libtbbmalloc.so.2" ,
95
+ "_ZN3rml11pool_mallocEPNS_10MemoryPoolEm" ,
96
+ "_ZN3rml12pool_reallocEPNS_10MemoryPoolEPvm" ,
97
+ "_ZN3rml19pool_aligned_mallocEPNS_10MemoryPoolEmm" ,
98
+ "_ZN3rml9pool_freeEPNS_10MemoryPoolEPv" ,
99
+ "_ZN3rml14pool_create_v1ElPKNS_13MemPoolPolicyEPPNS_10MemoryPoolE" ,
100
+ "_ZN3rml12pool_destroyEPNS_10MemoryPoolE" ,
101
+ "_ZN3rml13pool_identifyEPv" ,
102
+ "_ZN3rml10pool_msizeEPNS_10MemoryPoolEPv"
103
+ #endif
104
+ };
105
+
64
106
static int init_tbb_callbacks (tbb_callbacks_t * tbb_callbacks ) {
65
107
assert (tbb_callbacks );
66
108
67
- const char so_name [] = "libtbbmalloc.so.2" ;
68
- tbb_callbacks -> lib_handle = dlopen ( so_name , RTLD_LAZY );
109
+ const char * lib_name = tbb_symbol [ TBB_LIB_NAME ] ;
110
+ tbb_callbacks -> lib_handle = util_open_library ( lib_name );
69
111
if (!tbb_callbacks -> lib_handle ) {
70
- fprintf (stderr , "%s not found.\n" , so_name );
112
+ fprintf (stderr , "%s not found.\n" , lib_name );
71
113
return -1 ;
72
114
}
73
115
74
- * (void * * )& tbb_callbacks -> pool_malloc = dlsym (
75
- tbb_callbacks -> lib_handle , "_ZN3rml11pool_mallocEPNS_10MemoryPoolEm" );
76
- * (void * * )& tbb_callbacks -> pool_realloc =
77
- dlsym (tbb_callbacks -> lib_handle ,
78
- "_ZN3rml12pool_reallocEPNS_10MemoryPoolEPvm" );
79
- * (void * * )& tbb_callbacks -> pool_aligned_malloc =
80
- dlsym (tbb_callbacks -> lib_handle ,
81
- "_ZN3rml19pool_aligned_mallocEPNS_10MemoryPoolEmm" );
82
- * (void * * )& tbb_callbacks -> pool_free = dlsym (
83
- tbb_callbacks -> lib_handle , "_ZN3rml9pool_freeEPNS_10MemoryPoolEPv" );
84
- * (void * * )& tbb_callbacks -> pool_create_v1 = dlsym (
85
- tbb_callbacks -> lib_handle ,
86
- "_ZN3rml14pool_create_v1ElPKNS_13MemPoolPolicyEPPNS_10MemoryPoolE" );
87
- * (void * * )& tbb_callbacks -> pool_destroy = dlsym (
88
- tbb_callbacks -> lib_handle , "_ZN3rml12pool_destroyEPNS_10MemoryPoolE" );
89
- * (void * * )& tbb_callbacks -> pool_identify =
90
- dlsym (tbb_callbacks -> lib_handle , "_ZN3rml13pool_identifyEPv" );
91
- * (void * * )& tbb_callbacks -> pool_msize = dlsym (
92
- tbb_callbacks -> lib_handle , "_ZN3rml10pool_msizeEPNS_10MemoryPoolEPv" );
116
+ * (void * * )& tbb_callbacks -> pool_malloc = util_get_symbol_addr (
117
+ tbb_callbacks -> lib_handle , tbb_symbol [TBB_POOL_MALLOC ]);
118
+ * (void * * )& tbb_callbacks -> pool_realloc = util_get_symbol_addr (
119
+ tbb_callbacks -> lib_handle , tbb_symbol [TBB_POOL_REALLOC ]);
120
+ * (void * * )& tbb_callbacks -> pool_aligned_malloc = util_get_symbol_addr (
121
+ tbb_callbacks -> lib_handle , tbb_symbol [TBB_POOL_ALIGNED_MALLOC ]);
122
+ * (void * * )& tbb_callbacks -> pool_free = util_get_symbol_addr (
123
+ tbb_callbacks -> lib_handle , tbb_symbol [TBB_POOL_FREE ]);
124
+ * (void * * )& tbb_callbacks -> pool_create_v1 = util_get_symbol_addr (
125
+ tbb_callbacks -> lib_handle , tbb_symbol [TBB_POOL_CREATE_V1 ]);
126
+ * (void * * )& tbb_callbacks -> pool_destroy = util_get_symbol_addr (
127
+ tbb_callbacks -> lib_handle , tbb_symbol [TBB_POOL_DESTROY ]);
128
+ * (void * * )& tbb_callbacks -> pool_identify = util_get_symbol_addr (
129
+ tbb_callbacks -> lib_handle , tbb_symbol [TBB_POOL_IDENTIFY ]);
130
+ * (void * * )& tbb_callbacks -> pool_msize = util_get_symbol_addr (
131
+ tbb_callbacks -> lib_handle , tbb_symbol [TBB_POOL_MSIZE ]);
93
132
94
133
if (!tbb_callbacks -> pool_malloc || !tbb_callbacks -> pool_realloc ||
95
134
!tbb_callbacks -> pool_aligned_malloc || !tbb_callbacks -> pool_free ||
96
135
!tbb_callbacks -> pool_create_v1 || !tbb_callbacks -> pool_destroy ||
97
136
!tbb_callbacks -> pool_identify ) {
98
- fprintf (stderr , "Could not find symbols in %s.\n" , so_name );
99
- dlclose (tbb_callbacks -> lib_handle );
137
+ fprintf (stderr , "Could not find symbols in %s.\n" , lib_name );
138
+ util_close_library (tbb_callbacks -> lib_handle );
100
139
return -1 ;
101
140
}
102
141
@@ -169,7 +208,7 @@ static umf_result_t tbb_pool_initialize(umf_memory_provider_handle_t provider,
169
208
static void tbb_pool_finalize (void * pool ) {
170
209
tbb_memory_pool_t * pool_data = (tbb_memory_pool_t * )pool ;
171
210
pool_data -> tbb_callbacks .pool_destroy (pool_data -> tbb_pool );
172
- dlclose (pool_data -> tbb_callbacks .lib_handle );
211
+ util_close_library (pool_data -> tbb_callbacks .lib_handle );
173
212
umf_ba_global_free (pool_data );
174
213
}
175
214
0 commit comments