Skip to content

Commit 996273c

Browse files
committed
Add disable_provider_free parameter to pool jemalloc
Add the disable_provider_free parameter to pool jemalloc. It should be set to true if umfMemoryProviderFree() should never be called. This option will be needed by the future memory providers that will not provide the free() op. Signed-off-by: Lukasz Dorau <[email protected]>
1 parent c39f4aa commit 996273c

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)