3737typedef struct jemalloc_memory_pool_t {
3838 umf_memory_provider_handle_t provider ;
3939 unsigned int arena_index ; // index of jemalloc arena
40+ // set to true if umfMemoryProviderFree() should never be called
41+ bool disable_provider_free ;
4042} jemalloc_memory_pool_t ;
4143
4244static __TLS umf_result_t TLS_last_allocation_error ;
@@ -80,7 +82,9 @@ static void *arena_extent_alloc(extent_hooks_t *extent_hooks, void *new_addr,
8082 }
8183
8284 if (new_addr != NULL && ptr != new_addr ) {
83- umfMemoryProviderFree (pool -> provider , ptr , size );
85+ if (!pool -> disable_provider_free ) {
86+ umfMemoryProviderFree (pool -> provider , ptr , size );
87+ }
8488 return NULL ;
8589 }
8690
@@ -114,6 +118,10 @@ static void arena_extent_destroy(extent_hooks_t *extent_hooks, void *addr,
114118
115119 jemalloc_memory_pool_t * pool = get_pool_by_arena_index (arena_ind );
116120
121+ if (pool -> disable_provider_free ) {
122+ return ;
123+ }
124+
117125 umf_result_t ret ;
118126 ret = umfMemoryProviderFree (pool -> provider , addr , size );
119127 if (ret != UMF_RESULT_SUCCESS ) {
@@ -136,6 +144,10 @@ static bool arena_extent_dalloc(extent_hooks_t *extent_hooks, void *addr,
136144
137145 jemalloc_memory_pool_t * pool = get_pool_by_arena_index (arena_ind );
138146
147+ if (pool -> disable_provider_free ) {
148+ return true; // opt-out from deallocation
149+ }
150+
139151 umf_result_t ret ;
140152 ret = umfMemoryProviderFree (pool -> provider , addr , size );
141153 if (ret != UMF_RESULT_SUCCESS ) {
@@ -388,7 +400,9 @@ static umf_result_t op_initialize(umf_memory_provider_handle_t provider,
388400 void * params , void * * out_pool ) {
389401 assert (provider );
390402 assert (out_pool );
391- (void )params ; // unused
403+
404+ umf_jemalloc_pool_params_t * je_params =
405+ (umf_jemalloc_pool_params_t * )params ;
392406
393407 extent_hooks_t * pHooks = & arena_extent_hooks ;
394408 size_t unsigned_size = sizeof (unsigned );
@@ -402,6 +416,12 @@ static umf_result_t op_initialize(umf_memory_provider_handle_t provider,
402416
403417 pool -> provider = provider ;
404418
419+ if (je_params ) {
420+ pool -> disable_provider_free = je_params -> disable_provider_free ;
421+ } else {
422+ pool -> disable_provider_free = false;
423+ }
424+
405425 unsigned arena_index ;
406426 err = je_mallctl ("arenas.create" , (void * )& arena_index , & unsigned_size ,
407427 NULL , 0 );
0 commit comments