@@ -337,6 +337,7 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
337
337
338
338
static umf_result_t trackingFree (void * hProvider , void * ptr , size_t size ) {
339
339
umf_result_t ret ;
340
+ umf_result_t ret_remove = UMF_RESULT_ERROR_UNKNOWN ;
340
341
umf_tracking_memory_provider_t * p =
341
342
(umf_tracking_memory_provider_t * )hProvider ;
342
343
@@ -345,13 +346,13 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
345
346
// could allocate the memory at address `ptr` before a call to umfMemoryTrackerRemove
346
347
// resulting in inconsistent state.
347
348
if (ptr ) {
348
- ret = umfMemoryTrackerRemove (p -> hTracker , ptr );
349
- if (ret != UMF_RESULT_SUCCESS ) {
349
+ ret_remove = umfMemoryTrackerRemove (p -> hTracker , ptr );
350
+ if (ret_remove != UMF_RESULT_SUCCESS ) {
350
351
// DO NOT return an error here, because the tracking provider
351
352
// cannot change behaviour of the upstream provider.
352
353
LOG_ERR ("failed to remove the region from the tracker, ptr=%p, "
353
354
"size=%zu, ret = %d" ,
354
- ptr , size , ret );
355
+ ptr , size , ret_remove );
355
356
}
356
357
}
357
358
@@ -371,6 +372,12 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
371
372
ret = umfMemoryProviderFree (p -> hUpstream , ptr , size );
372
373
if (ret != UMF_RESULT_SUCCESS ) {
373
374
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
+
374
381
if (umfMemoryTrackerAdd (p -> hTracker , p -> pool , ptr , size ) !=
375
382
UMF_RESULT_SUCCESS ) {
376
383
LOG_ERR (
0 commit comments