Skip to content

Commit c197f44

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 c197f44

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
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: 19 additions & 1 deletion
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+
bool
41+
disable_provider_free; // set to true if umfMemoryProviderFree() should never be called
4042
} jemalloc_memory_pool_t;
4143

4244
static __TLS umf_result_t TLS_last_allocation_error;
@@ -114,6 +116,10 @@ static void arena_extent_destroy(extent_hooks_t *extent_hooks, void *addr,
114116

115117
jemalloc_memory_pool_t *pool = get_pool_by_arena_index(arena_ind);
116118

119+
if (pool->disable_provider_free) {
120+
return;
121+
}
122+
117123
umf_result_t ret;
118124
ret = umfMemoryProviderFree(pool->provider, addr, size);
119125
if (ret != UMF_RESULT_SUCCESS) {
@@ -136,6 +142,10 @@ static bool arena_extent_dalloc(extent_hooks_t *extent_hooks, void *addr,
136142

137143
jemalloc_memory_pool_t *pool = get_pool_by_arena_index(arena_ind);
138144

145+
if (pool->disable_provider_free) {
146+
return true; // opt-out from deallocation
147+
}
148+
139149
umf_result_t ret;
140150
ret = umfMemoryProviderFree(pool->provider, addr, size);
141151
if (ret != UMF_RESULT_SUCCESS) {
@@ -388,7 +398,9 @@ static umf_result_t op_initialize(umf_memory_provider_handle_t provider,
388398
void *params, void **out_pool) {
389399
assert(provider);
390400
assert(out_pool);
391-
(void)params; // unused
401+
402+
umf_jemalloc_pool_params_t *je_params =
403+
(umf_jemalloc_pool_params_t *)params;
392404

393405
extent_hooks_t *pHooks = &arena_extent_hooks;
394406
size_t unsigned_size = sizeof(unsigned);
@@ -402,6 +414,12 @@ static umf_result_t op_initialize(umf_memory_provider_handle_t provider,
402414

403415
pool->provider = provider;
404416

417+
if (je_params) {
418+
pool->disable_provider_free = je_params->disable_provider_free;
419+
} else {
420+
pool->disable_provider_free = false;
421+
}
422+
405423
unsigned arena_index;
406424
err = je_mallctl("arenas.create", (void *)&arena_index, &unsigned_size,
407425
NULL, 0);

0 commit comments

Comments
 (0)