@@ -34,79 +34,78 @@ typedef void (*raw_free_tbb_type)(intptr_t, void *, size_t);
34
34
static __TLS umf_result_t TLS_last_allocation_error ;
35
35
static __TLS umf_result_t TLS_last_free_error ;
36
36
37
- struct mem_pool_policy_s {
37
+ typedef struct tbb_mem_pool_policy_t {
38
38
raw_alloc_tbb_type pAlloc ;
39
39
raw_free_tbb_type pFree ;
40
40
size_t granularity ;
41
41
int version ;
42
42
unsigned fixed_pool : 1 , keep_all_memory : 1 , reserved : 30 ;
43
- };
43
+ } tbb_mem_pool_policy_t ;
44
44
45
- struct tbb_callbacks {
45
+ typedef struct tbb_callbacks_t {
46
46
void * (* pool_malloc )(void * , size_t );
47
47
void * (* pool_realloc )(void * , void * , size_t );
48
48
void * (* pool_aligned_malloc )(void * , size_t , size_t );
49
49
bool (* pool_free )(void * , void * );
50
- int (* pool_create_v1 )(intptr_t , const struct mem_pool_policy_s * , void * * );
50
+ int (* pool_create_v1 )(intptr_t , const struct tbb_mem_pool_policy_t * ,
51
+ void * * );
51
52
bool (* pool_destroy )(void * );
52
53
void * (* pool_identify )(void * object );
53
54
size_t (* pool_msize )(void * , void * );
54
- };
55
+ void * lib_handle ;
56
+ } tbb_callbacks_t ;
55
57
56
- struct tbb_memory_pool {
58
+ typedef struct tbb_memory_pool_t {
57
59
umf_memory_provider_handle_t mem_provider ;
58
60
void * tbb_pool ;
59
- };
61
+ tbb_callbacks_t tbb_callbacks ;
62
+ } tbb_memory_pool_t ;
60
63
61
- static struct tbb_callbacks g_tbb_ops ;
62
- static UTIL_ONCE_FLAG tbb_is_initialized = UTIL_ONCE_FLAG_INIT ;
63
- static bool Init_tbb_global_state_failed ;
64
+ static int init_tbb_callbacks (tbb_callbacks_t * tbb_callbacks ) {
65
+ assert (tbb_callbacks );
64
66
65
- static void init_tbb_global_state (void ) {
66
67
const char so_name [] = "libtbbmalloc.so.2" ;
67
- void * tbb_handle = dlopen (so_name , RTLD_LAZY );
68
- if (!tbb_handle ) {
68
+ tbb_callbacks -> lib_handle = dlopen (so_name , RTLD_LAZY );
69
+ if (!tbb_callbacks -> lib_handle ) {
69
70
fprintf (stderr , "%s not found.\n" , so_name );
70
- Init_tbb_global_state_failed = true;
71
- return ;
71
+ return -1 ;
72
72
}
73
73
74
- struct tbb_callbacks tbb_ops ;
75
-
76
- * (void * * )& tbb_ops . pool_malloc =
77
- dlsym (tbb_handle , "_ZN3rml11pool_mallocEPNS_10MemoryPoolEm" );
78
- * ( void * * ) & tbb_ops . pool_realloc =
79
- dlsym ( tbb_handle , "_ZN3rml12pool_reallocEPNS_10MemoryPoolEPvm" );
80
- * ( void * * ) & tbb_ops . pool_aligned_malloc =
81
- dlsym ( tbb_handle , "_ZN3rml19pool_aligned_mallocEPNS_10MemoryPoolEmm" );
82
- * (void * * )& tbb_ops . pool_free =
83
- dlsym ( tbb_handle , "_ZN3rml9pool_freeEPNS_10MemoryPoolEPv" );
84
- * (void * * )& tbb_ops . pool_create_v1 = dlsym (
85
- tbb_handle ,
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
86
"_ZN3rml14pool_create_v1ElPKNS_13MemPoolPolicyEPPNS_10MemoryPoolE" );
87
- * (void * * )& tbb_ops . pool_destroy =
88
- dlsym ( tbb_handle , "_ZN3rml12pool_destroyEPNS_10MemoryPoolE" );
89
- * (void * * )& tbb_ops . pool_identify =
90
- dlsym (tbb_handle , "_ZN3rml13pool_identifyEPv" );
91
- * (void * * )& tbb_ops . pool_msize =
92
- dlsym ( tbb_handle , "_ZN3rml10pool_msizeEPNS_10MemoryPoolEPv" );
93
-
94
- if (!tbb_ops . pool_malloc || !tbb_ops . pool_realloc ||
95
- !tbb_ops . pool_aligned_malloc || !tbb_ops . pool_free ||
96
- !tbb_ops . pool_create_v1 || !tbb_ops . pool_destroy ||
97
- !tbb_ops . pool_identify ) {
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" );
93
+
94
+ if (!tbb_callbacks -> pool_malloc || !tbb_callbacks -> pool_realloc ||
95
+ !tbb_callbacks -> pool_aligned_malloc || !tbb_callbacks -> pool_free ||
96
+ !tbb_callbacks -> pool_create_v1 || !tbb_callbacks -> pool_destroy ||
97
+ !tbb_callbacks -> pool_identify ) {
98
98
fprintf (stderr , "Could not find symbols in %s.\n" , so_name );
99
- dlclose (tbb_handle );
100
- Init_tbb_global_state_failed = true;
101
- return ;
99
+ dlclose (tbb_callbacks -> lib_handle );
100
+ return -1 ;
102
101
}
103
102
104
- g_tbb_ops = tbb_ops ;
103
+ return 0 ;
105
104
}
106
105
107
106
static void * tbb_raw_alloc_wrapper (intptr_t pool_id , size_t * raw_bytes ) {
108
107
void * resPtr ;
109
- struct tbb_memory_pool * pool = (struct tbb_memory_pool * )pool_id ;
108
+ tbb_memory_pool_t * pool = (tbb_memory_pool_t * )pool_id ;
110
109
umf_result_t ret =
111
110
umfMemoryProviderAlloc (pool -> mem_provider , * raw_bytes , 0 , & resPtr );
112
111
if (ret != UMF_RESULT_SUCCESS ) {
@@ -118,7 +117,7 @@ static void *tbb_raw_alloc_wrapper(intptr_t pool_id, size_t *raw_bytes) {
118
117
}
119
118
120
119
static void tbb_raw_free_wrapper (intptr_t pool_id , void * ptr , size_t bytes ) {
121
- struct tbb_memory_pool * pool = (struct tbb_memory_pool * )pool_id ;
120
+ tbb_memory_pool_t * pool = (tbb_memory_pool_t * )pool_id ;
122
121
umf_result_t ret = umfMemoryProviderFree (pool -> mem_provider , ptr , bytes );
123
122
if (ret != UMF_RESULT_SUCCESS ) {
124
123
TLS_last_free_error = ret ;
@@ -134,30 +133,30 @@ static umf_result_t tbb_pool_initialize(umf_memory_provider_handle_t provider,
134
133
(void )params ; // unused
135
134
136
135
const size_t GRANULARITY = 2 * 1024 * 1024 ;
137
- struct mem_pool_policy_s policy = {.pAlloc = tbb_raw_alloc_wrapper ,
138
- .pFree = tbb_raw_free_wrapper ,
139
- .granularity = GRANULARITY ,
140
- .version = 1 ,
141
- .fixed_pool = false,
142
- .keep_all_memory = false,
143
- .reserved = 0 };
144
-
145
- util_init_once (& tbb_is_initialized , init_tbb_global_state );
146
- if (Init_tbb_global_state_failed ) {
147
- fprintf (stderr , "loading TBB symbols failed\n" );
148
- return UMF_RESULT_ERROR_UNKNOWN ;
149
- }
150
-
151
- struct tbb_memory_pool * pool_data =
152
- umf_ba_global_alloc (sizeof (struct tbb_memory_pool ));
136
+ tbb_mem_pool_policy_t policy = {.pAlloc = tbb_raw_alloc_wrapper ,
137
+ .pFree = tbb_raw_free_wrapper ,
138
+ .granularity = GRANULARITY ,
139
+ .version = 1 ,
140
+ .fixed_pool = false,
141
+ .keep_all_memory = false,
142
+ .reserved = 0 };
143
+
144
+ tbb_memory_pool_t * pool_data =
145
+ umf_ba_global_alloc (sizeof (tbb_memory_pool_t ));
153
146
if (!pool_data ) {
154
147
fprintf (stderr , "cannot allocate memory for metadata\n" );
155
148
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
156
149
}
157
150
151
+ int ret = init_tbb_callbacks (& pool_data -> tbb_callbacks );
152
+ if (ret != 0 ) {
153
+ fprintf (stderr , "loading TBB symbols failed\n" );
154
+ return UMF_RESULT_ERROR_UNKNOWN ;
155
+ }
156
+
158
157
pool_data -> mem_provider = provider ;
159
- int ret = g_tbb_ops .pool_create_v1 ((intptr_t )pool_data , & policy ,
160
- & (pool_data -> tbb_pool ));
158
+ ret = pool_data -> tbb_callbacks .pool_create_v1 ((intptr_t )pool_data , & policy ,
159
+ & (pool_data -> tbb_pool ));
161
160
if (ret != TBBMALLOC_OK ) {
162
161
return UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC ;
163
162
}
@@ -168,16 +167,16 @@ static umf_result_t tbb_pool_initialize(umf_memory_provider_handle_t provider,
168
167
}
169
168
170
169
static void tbb_pool_finalize (void * pool ) {
171
- util_init_once ( & tbb_is_initialized , init_tbb_global_state ) ;
172
- struct tbb_memory_pool * pool_data = ( struct tbb_memory_pool * ) pool ;
173
- g_tbb_ops . pool_destroy (pool_data -> tbb_pool );
174
- umf_ba_global_free (pool_data , sizeof (struct tbb_memory_pool ));
170
+ tbb_memory_pool_t * pool_data = ( tbb_memory_pool_t * ) pool ;
171
+ pool_data -> tbb_callbacks . pool_destroy ( pool_data -> tbb_pool ) ;
172
+ dlclose (pool_data -> tbb_callbacks . lib_handle );
173
+ umf_ba_global_free (pool_data , sizeof (tbb_memory_pool_t ));
175
174
}
176
175
177
176
static void * tbb_malloc (void * pool , size_t size ) {
178
- struct tbb_memory_pool * pool_data = (struct tbb_memory_pool * )pool ;
177
+ tbb_memory_pool_t * pool_data = (tbb_memory_pool_t * )pool ;
179
178
TLS_last_allocation_error = UMF_RESULT_SUCCESS ;
180
- void * ptr = g_tbb_ops .pool_malloc (pool_data -> tbb_pool , size );
179
+ void * ptr = pool_data -> tbb_callbacks .pool_malloc (pool_data -> tbb_pool , size );
181
180
if (ptr == NULL ) {
182
181
if (TLS_last_allocation_error == UMF_RESULT_SUCCESS ) {
183
182
TLS_last_allocation_error = UMF_RESULT_ERROR_UNKNOWN ;
@@ -202,9 +201,10 @@ static void *tbb_calloc(void *pool, size_t num, size_t size) {
202
201
}
203
202
204
203
static void * tbb_realloc (void * pool , void * ptr , size_t size ) {
205
- struct tbb_memory_pool * pool_data = (struct tbb_memory_pool * )pool ;
204
+ tbb_memory_pool_t * pool_data = (tbb_memory_pool_t * )pool ;
206
205
TLS_last_allocation_error = UMF_RESULT_SUCCESS ;
207
- void * new_ptr = g_tbb_ops .pool_realloc (pool_data -> tbb_pool , ptr , size );
206
+ void * new_ptr =
207
+ pool_data -> tbb_callbacks .pool_realloc (pool_data -> tbb_pool , ptr , size );
208
208
if (new_ptr == NULL ) {
209
209
if (TLS_last_allocation_error == UMF_RESULT_SUCCESS ) {
210
210
TLS_last_allocation_error = UMF_RESULT_ERROR_UNKNOWN ;
@@ -216,10 +216,10 @@ static void *tbb_realloc(void *pool, void *ptr, size_t size) {
216
216
}
217
217
218
218
static void * tbb_aligned_malloc (void * pool , size_t size , size_t alignment ) {
219
- struct tbb_memory_pool * pool_data = (struct tbb_memory_pool * )pool ;
219
+ tbb_memory_pool_t * pool_data = (tbb_memory_pool_t * )pool ;
220
220
TLS_last_allocation_error = UMF_RESULT_SUCCESS ;
221
- void * ptr =
222
- g_tbb_ops . pool_aligned_malloc ( pool_data -> tbb_pool , size , alignment );
221
+ void * ptr = pool_data -> tbb_callbacks . pool_aligned_malloc (
222
+ pool_data -> tbb_pool , size , alignment );
223
223
if (ptr == NULL ) {
224
224
if (TLS_last_allocation_error == UMF_RESULT_SUCCESS ) {
225
225
TLS_last_allocation_error = UMF_RESULT_ERROR_UNKNOWN ;
@@ -243,8 +243,8 @@ static umf_result_t tbb_free(void *pool, void *ptr) {
243
243
// other threads.
244
244
utils_annotate_release (pool );
245
245
246
- struct tbb_memory_pool * pool_data = (struct tbb_memory_pool * )pool ;
247
- if (g_tbb_ops .pool_free (pool_data -> tbb_pool , ptr )) {
246
+ tbb_memory_pool_t * pool_data = (tbb_memory_pool_t * )pool ;
247
+ if (pool_data -> tbb_callbacks .pool_free (pool_data -> tbb_pool , ptr )) {
248
248
return UMF_RESULT_SUCCESS ;
249
249
}
250
250
@@ -256,8 +256,8 @@ static umf_result_t tbb_free(void *pool, void *ptr) {
256
256
}
257
257
258
258
static size_t tbb_malloc_usable_size (void * pool , void * ptr ) {
259
- struct tbb_memory_pool * pool_data = (struct tbb_memory_pool * )pool ;
260
- return g_tbb_ops .pool_msize (pool_data -> tbb_pool , ptr );
259
+ tbb_memory_pool_t * pool_data = (tbb_memory_pool_t * )pool ;
260
+ return pool_data -> tbb_callbacks .pool_msize (pool_data -> tbb_pool , ptr );
261
261
}
262
262
263
263
static umf_result_t tbb_get_last_allocation_error (void * pool ) {
0 commit comments