Skip to content

Commit 4dab796

Browse files
authored
Merge pull request #803 from ldorau/Fix_trackingFree_-_do_not_add_a_not_removed_entry
Fix `trackingFree()` - do not add a not removed entry
2 parents dc8dcf8 + 1b32ade commit 4dab796

File tree

1 file changed

+15
-3
lines changed

1 file changed

+15
-3
lines changed

src/provider/provider_tracking.c

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ static umf_result_t umfMemoryTrackerRemove(umf_memory_tracker_handle_t hTracker,
8080
return UMF_RESULT_ERROR_UNKNOWN;
8181
}
8282

83+
tracker_value_t *v = value;
84+
85+
LOG_DEBUG("memory region removed: tracker=%p, ptr=%p, size=%zu",
86+
(void *)hTracker, ptr, v->size);
87+
8388
umf_ba_free(hTracker->tracker_allocator, value);
8489

8590
return UMF_RESULT_SUCCESS;
@@ -332,6 +337,7 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
332337

333338
static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
334339
umf_result_t ret;
340+
umf_result_t ret_remove = UMF_RESULT_ERROR_UNKNOWN;
335341
umf_tracking_memory_provider_t *p =
336342
(umf_tracking_memory_provider_t *)hProvider;
337343

@@ -340,13 +346,13 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
340346
// could allocate the memory at address `ptr` before a call to umfMemoryTrackerRemove
341347
// resulting in inconsistent state.
342348
if (ptr) {
343-
ret = umfMemoryTrackerRemove(p->hTracker, ptr);
344-
if (ret != UMF_RESULT_SUCCESS) {
349+
ret_remove = umfMemoryTrackerRemove(p->hTracker, ptr);
350+
if (ret_remove != UMF_RESULT_SUCCESS) {
345351
// DO NOT return an error here, because the tracking provider
346352
// cannot change behaviour of the upstream provider.
347353
LOG_ERR("failed to remove the region from the tracker, ptr=%p, "
348354
"size=%zu, ret = %d",
349-
ptr, size, ret);
355+
ptr, size, ret_remove);
350356
}
351357
}
352358

@@ -366,6 +372,12 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
366372
ret = umfMemoryProviderFree(p->hUpstream, ptr, size);
367373
if (ret != UMF_RESULT_SUCCESS) {
368374
LOG_ERR("upstream provider is failed to free the memory");
375+
// Do not add memory back to the tracker,
376+
// if it had not been removed.
377+
if (ret_remove != UMF_RESULT_SUCCESS) {
378+
return ret;
379+
}
380+
369381
if (umfMemoryTrackerAdd(p->hTracker, p->pool, ptr, size) !=
370382
UMF_RESULT_SUCCESS) {
371383
LOG_ERR(

0 commit comments

Comments
 (0)