@@ -31,6 +31,7 @@ typedef void (*raw_free_tbb_type)(intptr_t, void *, size_t);
31
31
static __TLS umf_result_t TLS_last_allocation_error ;
32
32
static __TLS umf_result_t TLS_last_free_error ;
33
33
34
+ static const size_t DEFAULT_GRANULARITY = 2 * 1024 * 1024 ; // 2MB
34
35
typedef struct tbb_mem_pool_policy_t {
35
36
raw_alloc_tbb_type pAlloc ;
36
37
raw_free_tbb_type pFree ;
@@ -39,6 +40,11 @@ typedef struct tbb_mem_pool_policy_t {
39
40
unsigned fixed_pool : 1 , keep_all_memory : 1 , reserved : 30 ;
40
41
} tbb_mem_pool_policy_t ;
41
42
43
+ typedef struct umf_scalable_pool_params_t {
44
+ size_t granularity ;
45
+ bool keep_all_memory ;
46
+ } umf_scalable_pool_params_t ;
47
+
42
48
typedef struct tbb_callbacks_t {
43
49
void * (* pool_malloc )(void * , size_t );
44
50
void * (* pool_realloc )(void * , void * , size_t );
@@ -167,19 +173,88 @@ static void tbb_raw_free_wrapper(intptr_t pool_id, void *ptr, size_t bytes) {
167
173
}
168
174
}
169
175
176
+ umf_result_t
177
+ umfScalablePoolParamsCreate (umf_scalable_pool_params_handle_t * params ) {
178
+ if (!params ) {
179
+ LOG_ERR ("scalable pool params handle is NULL" );
180
+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
181
+ }
182
+
183
+ umf_scalable_pool_params_t * params_data =
184
+ umf_ba_global_alloc (sizeof (umf_scalable_pool_params_t ));
185
+ if (!params_data ) {
186
+ LOG_ERR ("cannot allocate memory for scalable poolparams" );
187
+ return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
188
+ }
189
+
190
+ params_data -> granularity = DEFAULT_GRANULARITY ;
191
+ params_data -> keep_all_memory = false;
192
+
193
+ * params = (umf_scalable_pool_params_handle_t )params_data ;
194
+
195
+ return UMF_RESULT_SUCCESS ;
196
+ }
197
+
198
+ umf_result_t
199
+ umfScalablePoolParamsDestroy (umf_scalable_pool_params_handle_t params ) {
200
+ if (!params ) {
201
+ LOG_ERR ("params is NULL" );
202
+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
203
+ }
204
+
205
+ umf_ba_global_free (params );
206
+
207
+ return UMF_RESULT_SUCCESS ;
208
+ }
209
+
210
+ umf_result_t
211
+ umfScalablePoolParamsSetGranularity (umf_scalable_pool_params_handle_t params ,
212
+ size_t granularity ) {
213
+ if (!params ) {
214
+ LOG_ERR ("params is NULL" );
215
+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
216
+ }
217
+
218
+ if (granularity == 0 ) {
219
+ LOG_ERR ("granularity cannot be 0" );
220
+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
221
+ }
222
+
223
+ params -> granularity = granularity ;
224
+
225
+ return UMF_RESULT_SUCCESS ;
226
+ }
227
+
228
+ umf_result_t
229
+ umfScalablePoolParamsSetKeepAllMemory (umf_scalable_pool_params_handle_t params ,
230
+ bool keep_all_memory ) {
231
+ if (!params ) {
232
+ LOG_ERR ("params is NULL" );
233
+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
234
+ }
235
+
236
+ params -> keep_all_memory = keep_all_memory ;
237
+
238
+ return UMF_RESULT_SUCCESS ;
239
+ }
240
+
170
241
static umf_result_t tbb_pool_initialize (umf_memory_provider_handle_t provider ,
171
242
void * params , void * * pool ) {
172
- (void )params ; // unused
173
-
174
- const size_t GRANULARITY = 2 * 1024 * 1024 ;
175
243
tbb_mem_pool_policy_t policy = {.pAlloc = tbb_raw_alloc_wrapper ,
176
244
.pFree = tbb_raw_free_wrapper ,
177
- .granularity = GRANULARITY ,
245
+ .granularity = DEFAULT_GRANULARITY ,
178
246
.version = 1 ,
179
247
.fixed_pool = false,
180
248
.keep_all_memory = false,
181
249
.reserved = 0 };
182
250
251
+ if (params ) {
252
+ umf_scalable_pool_params_handle_t scalable_params =
253
+ (umf_scalable_pool_params_handle_t )params ;
254
+ policy .granularity = scalable_params -> granularity ;
255
+ policy .keep_all_memory = scalable_params -> keep_all_memory ;
256
+ }
257
+
183
258
tbb_memory_pool_t * pool_data =
184
259
umf_ba_global_alloc (sizeof (tbb_memory_pool_t ));
185
260
if (!pool_data ) {
0 commit comments