37
37
typedef struct jemalloc_memory_pool_t {
38
38
umf_memory_provider_handle_t provider ;
39
39
unsigned int arena_index ; // index of jemalloc arena
40
+ // set to true if umfMemoryProviderFree() should never be called
41
+ bool disable_provider_free ;
40
42
} jemalloc_memory_pool_t ;
41
43
42
44
static __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,
80
82
}
81
83
82
84
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
+ }
84
88
return NULL ;
85
89
}
86
90
@@ -114,6 +118,10 @@ static void arena_extent_destroy(extent_hooks_t *extent_hooks, void *addr,
114
118
115
119
jemalloc_memory_pool_t * pool = get_pool_by_arena_index (arena_ind );
116
120
121
+ if (pool -> disable_provider_free ) {
122
+ return ;
123
+ }
124
+
117
125
umf_result_t ret ;
118
126
ret = umfMemoryProviderFree (pool -> provider , addr , size );
119
127
if (ret != UMF_RESULT_SUCCESS ) {
@@ -136,6 +144,10 @@ static bool arena_extent_dalloc(extent_hooks_t *extent_hooks, void *addr,
136
144
137
145
jemalloc_memory_pool_t * pool = get_pool_by_arena_index (arena_ind );
138
146
147
+ if (pool -> disable_provider_free ) {
148
+ return true; // opt-out from deallocation
149
+ }
150
+
139
151
umf_result_t ret ;
140
152
ret = umfMemoryProviderFree (pool -> provider , addr , size );
141
153
if (ret != UMF_RESULT_SUCCESS ) {
@@ -388,7 +400,9 @@ static umf_result_t op_initialize(umf_memory_provider_handle_t provider,
388
400
void * params , void * * out_pool ) {
389
401
assert (provider );
390
402
assert (out_pool );
391
- (void )params ; // unused
403
+
404
+ umf_jemalloc_pool_params_t * je_params =
405
+ (umf_jemalloc_pool_params_t * )params ;
392
406
393
407
extent_hooks_t * pHooks = & arena_extent_hooks ;
394
408
size_t unsigned_size = sizeof (unsigned );
@@ -402,6 +416,12 @@ static umf_result_t op_initialize(umf_memory_provider_handle_t provider,
402
416
403
417
pool -> provider = provider ;
404
418
419
+ if (je_params ) {
420
+ pool -> disable_provider_free = je_params -> disable_provider_free ;
421
+ } else {
422
+ pool -> disable_provider_free = false;
423
+ }
424
+
405
425
unsigned arena_index ;
406
426
err = je_mallctl ("arenas.create" , (void * )& arena_index , & unsigned_size ,
407
427
NULL , 0 );
0 commit comments