Skip to content

Commit 790f113

Browse files
committed
Postpone freeing in critnib
Signed-off-by: Lukasz Dorau <[email protected]>
1 parent ce2e356 commit 790f113

File tree

3 files changed

+42
-14
lines changed

3 files changed

+42
-14
lines changed

src/critnib/critnib.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ static void free_leaf(struct critnib *__restrict c,
293293
return;
294294
}
295295

296-
if (c->cb_free_leaf && k) {
296+
if (c->cb_free_leaf && k && k->value) {
297297
c->cb_free_leaf(c->leaf_allocator, (void *)k->value);
298298
}
299299

@@ -375,6 +375,10 @@ int critnib_insert(struct critnib *c, word key, void *value, int update) {
375375
word at = path ^ key;
376376
if (!at) {
377377
ASSERT(is_leaf(n));
378+
if (to_leaf(kn)->value == value) {
379+
// do not free the value
380+
to_leaf(kn)->value = NULL;
381+
}
378382
free_leaf(c, to_leaf(kn));
379383

380384
if (update) {

src/pool/pool_disjoint.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,6 @@ static void destroy_slab(slab_t *slab) {
140140
if (res != UMF_RESULT_SUCCESS) {
141141
LOG_ERR("deallocation of slab data failed!");
142142
}
143-
144-
umf_ba_global_free(slab);
145143
}
146144

147145
static size_t slab_find_first_available_chunk_idx(const slab_t *slab) {
@@ -570,6 +568,18 @@ static void *disjoint_pool_allocate(disjoint_pool_t *pool, size_t size) {
570568
return ptr;
571569
}
572570

571+
/*
572+
* free_slab - callback for freeing the slab.
573+
* It is called by critnib when the slab
574+
* is removed from the critnib.
575+
*/
576+
static void free_slab(void *unused, void *slab) {
577+
(void)unused;
578+
if (slab) {
579+
umf_ba_global_free(slab);
580+
}
581+
}
582+
573583
umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
574584
const void *params, void **ppPool) {
575585
// TODO set defaults when user pass the NULL as params
@@ -597,7 +607,7 @@ umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
597607
disjoint_pool->provider = provider;
598608
disjoint_pool->params = *dp_params;
599609

600-
disjoint_pool->known_slabs = critnib_new(NULL, NULL);
610+
disjoint_pool->known_slabs = critnib_new(free_slab, NULL);
601611
if (disjoint_pool->known_slabs == NULL) {
602612
goto err_free_disjoint_pool;
603613
}

src/provider/provider_tracking.c

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -271,8 +271,6 @@ static umf_result_t umfMemoryTrackerRemove(umf_memory_tracker_handle_t hTracker,
271271
parent_value->n_children--;
272272
}
273273

274-
umf_ba_free(hTracker->alloc_info_allocator, value);
275-
276274
return UMF_RESULT_SUCCESS;
277275
}
278276

@@ -339,8 +337,6 @@ umfMemoryTrackerRemoveIpcSegment(umf_memory_tracker_handle_t hTracker,
339337
(void *)hTracker, ptr, v->size, (void *)v->provider,
340338
(void *)v->ipc_cache_value);
341339

342-
umf_ba_free(hTracker->ipc_info_allocator, value);
343-
344340
return UMF_RESULT_SUCCESS;
345341
}
346342

@@ -664,8 +660,6 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
664660
lowLevel, lowPtr, lowValue->n_children, highPtr,
665661
highValue->n_children, totalSize);
666662

667-
umf_ba_free(provider->hTracker->alloc_info_allocator, highValue);
668-
669663
return UMF_RESULT_SUCCESS;
670664

671665
err_fatal:
@@ -715,7 +709,6 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
715709
"size=%zu, ret = %d",
716710
ptr, size, ret);
717711
}
718-
umf_ba_global_free(value);
719712
}
720713

721714
ret = umfMemoryProviderFree(p->hUpstream, ptr, size);
@@ -1119,6 +1112,13 @@ umf_memory_provider_ops_t UMF_TRACKING_MEMORY_PROVIDER_OPS = {
11191112
.ipc.open_ipc_handle = trackingOpenIpcHandle,
11201113
.ipc.close_ipc_handle = trackingCloseIpcHandle};
11211114

1115+
static void free_ipc_cache_value(void *unused, void *ipc_cache_value) {
1116+
(void)unused;
1117+
if (ipc_cache_value) {
1118+
umf_ba_global_free(ipc_cache_value);
1119+
}
1120+
}
1121+
11221122
umf_result_t umfTrackingMemoryProviderCreate(
11231123
umf_memory_provider_handle_t hUpstream, umf_memory_pool_handle_t hPool,
11241124
umf_memory_provider_handle_t *hTrackingProvider) {
@@ -1131,7 +1131,7 @@ umf_result_t umfTrackingMemoryProviderCreate(
11311131
return UMF_RESULT_ERROR_UNKNOWN;
11321132
}
11331133
params.pool = hPool;
1134-
params.ipcCache = critnib_new(NULL, NULL);
1134+
params.ipcCache = critnib_new(free_ipc_cache_value, NULL);
11351135
if (!params.ipcCache) {
11361136
LOG_ERR("failed to create IPC cache");
11371137
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
@@ -1159,6 +1159,18 @@ void umfTrackingMemoryProviderGetUpstreamProvider(
11591159
*hUpstream = p->hUpstream;
11601160
}
11611161

1162+
static void free_leaf(void *leaf_allocator, void *ptr) {
1163+
if (ptr) {
1164+
umf_ba_free(leaf_allocator, ptr);
1165+
}
1166+
}
1167+
1168+
static void free_ipc_segment(void *ipc_info_allocator, void *ptr) {
1169+
if (ptr) {
1170+
umf_ba_free(ipc_info_allocator, ptr);
1171+
}
1172+
}
1173+
11621174
umf_memory_tracker_handle_t umfMemoryTrackerCreate(void) {
11631175
umf_memory_tracker_handle_t handle =
11641176
umf_ba_global_alloc(sizeof(struct umf_memory_tracker_t));
@@ -1183,7 +1195,8 @@ umf_memory_tracker_handle_t umfMemoryTrackerCreate(void) {
11831195

11841196
int i;
11851197
for (i = 0; i < MAX_LEVELS_OF_ALLOC_SEGMENT_MAP; i++) {
1186-
handle->alloc_segments_map[i] = critnib_new(NULL, NULL);
1198+
handle->alloc_segments_map[i] =
1199+
critnib_new(free_leaf, alloc_info_allocator);
11871200
if (!handle->alloc_segments_map[i]) {
11881201
goto err_destroy_alloc_segments_map;
11891202
}
@@ -1195,7 +1208,8 @@ umf_memory_tracker_handle_t umfMemoryTrackerCreate(void) {
11951208
goto err_destroy_alloc_segments_map;
11961209
}
11971210

1198-
handle->ipc_segments_map = critnib_new(NULL, NULL);
1211+
handle->ipc_segments_map =
1212+
critnib_new(free_ipc_segment, handle->ipc_info_allocator);
11991213
if (!handle->ipc_segments_map) {
12001214
goto err_destroy_ipc_info_allocator;
12011215
}

0 commit comments

Comments
 (0)