@@ -60,20 +60,24 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
60
60
}
61
61
62
62
static umf_result_t umfMemoryTrackerRemove (umf_memory_tracker_handle_t hTracker ,
63
- const void * ptr ) {
63
+ const void * ptr , size_t * size ) {
64
64
assert (ptr );
65
65
66
66
// TODO: there is no support for removing partial ranges (or multiple entries
67
67
// in a single remove call) yet.
68
68
// Every umfMemoryTrackerAdd(..., ptr, ...) should have a corresponding
69
69
// umfMemoryTrackerRemove call with the same ptr value.
70
70
71
- void * value = critnib_remove (hTracker -> map , (uintptr_t )ptr );
71
+ tracker_value_t * value = critnib_remove (hTracker -> map , (uintptr_t )ptr );
72
72
if (!value ) {
73
73
LOG_ERR ("umfMemoryTrackerRemove: pointer %p not found in the map" , ptr );
74
74
return UMF_RESULT_ERROR_UNKNOWN ;
75
75
}
76
76
77
+ if (size ) {
78
+ * size = value -> size ;
79
+ }
80
+
77
81
umf_ba_free (hTracker -> tracker_allocator , value );
78
82
79
83
return UMF_RESULT_SUCCESS ;
@@ -318,13 +322,14 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
318
322
umf_result_t ret ;
319
323
umf_tracking_memory_provider_t * p =
320
324
(umf_tracking_memory_provider_t * )hProvider ;
325
+ size_t saved_size = 0 ;
321
326
322
327
// umfMemoryTrackerRemove should be called before umfMemoryProviderFree
323
328
// to avoid a race condition. If the order would be different, other thread
324
329
// could allocate the memory at address `ptr` before a call to umfMemoryTrackerRemove
325
330
// resulting in inconsistent state.
326
331
if (ptr ) {
327
- ret = umfMemoryTrackerRemove (p -> hTracker , ptr );
332
+ ret = umfMemoryTrackerRemove (p -> hTracker , ptr , & saved_size );
328
333
if (ret != UMF_RESULT_SUCCESS ) {
329
334
// DO NOT return an error here, because the tracking provider
330
335
// cannot change behaviour of the upstream provider.
@@ -343,6 +348,15 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
343
348
umf_ba_global_free (value );
344
349
}
345
350
351
+ // umfMemoryProviderFree() should not be called with size == 0,
352
+ // so use the size saved in the tracking provider.
353
+ if (size == 0 ) {
354
+ size = saved_size ;
355
+ }
356
+ if (saved_size ) {
357
+ assert (size == saved_size );
358
+ }
359
+
346
360
ret = umfMemoryProviderFree (p -> hUpstream , ptr , size );
347
361
if (ret != UMF_RESULT_SUCCESS ) {
348
362
LOG_ERR ("tracking free: umfMemoryProviderFree failed" );
@@ -608,7 +622,7 @@ static umf_result_t trackingCloseIpcHandle(void *provider, void *ptr,
608
622
// could allocate the memory at address `ptr` before a call to umfMemoryTrackerRemove
609
623
// resulting in inconsistent state.
610
624
if (ptr ) {
611
- umf_result_t ret = umfMemoryTrackerRemove (p -> hTracker , ptr );
625
+ umf_result_t ret = umfMemoryTrackerRemove (p -> hTracker , ptr , NULL );
612
626
if (ret != UMF_RESULT_SUCCESS ) {
613
627
// DO NOT return an error here, because the tracking provider
614
628
// cannot change behaviour of the upstream provider.
0 commit comments