@@ -31,6 +31,7 @@ typedef void (*raw_free_tbb_type)(intptr_t, void *, size_t);
3131static __TLS umf_result_t TLS_last_allocation_error ;
3232static __TLS umf_result_t TLS_last_free_error ;
3333
34+ static const size_t DEFAULT_GRANULARITY = 2 * 1024 * 1024 ; // 2MB
3435typedef struct tbb_mem_pool_policy_t {
3536 raw_alloc_tbb_type pAlloc ;
3637 raw_free_tbb_type pFree ;
@@ -39,6 +40,11 @@ typedef struct tbb_mem_pool_policy_t {
3940 unsigned fixed_pool : 1 , keep_all_memory : 1 , reserved : 30 ;
4041} tbb_mem_pool_policy_t ;
4142
43+ typedef struct umf_scalable_pool_params_t {
44+ size_t granularity ;
45+ bool keep_all_memory ;
46+ } umf_scalable_pool_params_t ;
47+
4248typedef struct tbb_callbacks_t {
4349 void * (* pool_malloc )(void * , size_t );
4450 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) {
167173 }
168174}
169175
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+
170241static umf_result_t tbb_pool_initialize (umf_memory_provider_handle_t provider ,
171242 void * params , void * * pool ) {
172- (void )params ; // unused
173-
174- const size_t GRANULARITY = 2 * 1024 * 1024 ;
175243 tbb_mem_pool_policy_t policy = {.pAlloc = tbb_raw_alloc_wrapper ,
176244 .pFree = tbb_raw_free_wrapper ,
177- .granularity = GRANULARITY ,
245+ .granularity = DEFAULT_GRANULARITY ,
178246 .version = 1 ,
179247 .fixed_pool = false,
180248 .keep_all_memory = false,
181249 .reserved = 0 };
182250
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+
183258 tbb_memory_pool_t * pool_data =
184259 umf_ba_global_alloc (sizeof (tbb_memory_pool_t ));
185260 if (!pool_data ) {
0 commit comments