Skip to content

Commit cb6b8bb

Browse files
authored
Merge pull request #618 from ldorau/Add_provider_free_always_fails_parameter_to_pool_jemalloc
Add disable_provider_free parameter to pool jemalloc
2 parents 8bb61a4 + 996273c commit cb6b8bb

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

include/umf/pools/pool_jemalloc.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,15 @@
1414
extern "C" {
1515
#endif
1616

17+
#include <stdbool.h>
1718
#include <umf/memory_pool_ops.h>
1819

20+
/// @brief Configuration of Jemalloc Pool
21+
typedef struct umf_jemalloc_pool_params_t {
22+
/// Set to true if umfMemoryProviderFree() should never be called.
23+
bool disable_provider_free;
24+
} umf_jemalloc_pool_params_t;
25+
1926
umf_memory_pool_ops_t *umfJemallocPoolOps(void);
2027

2128
#ifdef __cplusplus

src/pool/pool_jemalloc.c

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
typedef 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

4244
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,
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

Comments
 (0)