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>
25
23
#include "base_alloc_global.h"
26
24
#include "utils_common.h"
27
25
#include "utils_concurrency.h"
26
+ #include "utils_load_library.h"
28
27
#include "utils_sanitizers.h"
29
28
30
29
typedef void * (* raw_alloc_tbb_type )(intptr_t , size_t * );
@@ -51,7 +50,11 @@ typedef struct tbb_callbacks_t {
51
50
bool (* pool_destroy )(void * );
52
51
void * (* pool_identify )(void * object );
53
52
size_t (* pool_msize )(void * , void * );
53
+ #ifdef _WIN32
54
+ HMODULE lib_handle ;
55
+ #else
54
56
void * lib_handle ;
57
+ #endif
55
58
} tbb_callbacks_t ;
56
59
57
60
typedef struct tbb_memory_pool_t {
@@ -60,42 +63,79 @@ typedef struct tbb_memory_pool_t {
60
63
tbb_callbacks_t tbb_callbacks ;
61
64
} tbb_memory_pool_t ;
62
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
+
63
106
static int init_tbb_callbacks (tbb_callbacks_t * tbb_callbacks ) {
64
107
assert (tbb_callbacks );
65
108
66
- const char so_name [] = "libtbbmalloc.so.2" ;
67
- 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 );
68
111
if (!tbb_callbacks -> lib_handle ) {
69
- fprintf (stderr , "%s not found.\n" , so_name );
112
+ fprintf (stderr , "%s not found.\n" , lib_name );
70
113
return -1 ;
71
114
}
72
115
73
- * (void * * )& tbb_callbacks -> pool_malloc = dlsym (
74
- tbb_callbacks -> lib_handle , "_ZN3rml11pool_mallocEPNS_10MemoryPoolEm" );
75
- * (void * * )& tbb_callbacks -> pool_realloc =
76
- dlsym (tbb_callbacks -> lib_handle ,
77
- "_ZN3rml12pool_reallocEPNS_10MemoryPoolEPvm" );
78
- * (void * * )& tbb_callbacks -> pool_aligned_malloc =
79
- dlsym (tbb_callbacks -> lib_handle ,
80
- "_ZN3rml19pool_aligned_mallocEPNS_10MemoryPoolEmm" );
81
- * (void * * )& tbb_callbacks -> pool_free = dlsym (
82
- tbb_callbacks -> lib_handle , "_ZN3rml9pool_freeEPNS_10MemoryPoolEPv" );
83
- * (void * * )& tbb_callbacks -> pool_create_v1 = dlsym (
84
- tbb_callbacks -> lib_handle ,
85
- "_ZN3rml14pool_create_v1ElPKNS_13MemPoolPolicyEPPNS_10MemoryPoolE" );
86
- * (void * * )& tbb_callbacks -> pool_destroy = dlsym (
87
- tbb_callbacks -> lib_handle , "_ZN3rml12pool_destroyEPNS_10MemoryPoolE" );
88
- * (void * * )& tbb_callbacks -> pool_identify =
89
- dlsym (tbb_callbacks -> lib_handle , "_ZN3rml13pool_identifyEPv" );
90
- * (void * * )& tbb_callbacks -> pool_msize = dlsym (
91
- 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 ]);
92
132
93
133
if (!tbb_callbacks -> pool_malloc || !tbb_callbacks -> pool_realloc ||
94
134
!tbb_callbacks -> pool_aligned_malloc || !tbb_callbacks -> pool_free ||
95
135
!tbb_callbacks -> pool_create_v1 || !tbb_callbacks -> pool_destroy ||
96
136
!tbb_callbacks -> pool_identify ) {
97
- fprintf (stderr , "Could not find symbols in %s.\n" , so_name );
98
- 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 );
99
139
return -1 ;
100
140
}
101
141
@@ -168,7 +208,7 @@ static umf_result_t tbb_pool_initialize(umf_memory_provider_handle_t provider,
168
208
static void tbb_pool_finalize (void * pool ) {
169
209
tbb_memory_pool_t * pool_data = (tbb_memory_pool_t * )pool ;
170
210
pool_data -> tbb_callbacks .pool_destroy (pool_data -> tbb_pool );
171
- dlclose (pool_data -> tbb_callbacks .lib_handle );
211
+ util_close_library (pool_data -> tbb_callbacks .lib_handle );
172
212
umf_ba_global_free (pool_data );
173
213
}
174
214
0 commit comments