@@ -81,10 +81,22 @@ static tracker_alloc_info_t *get_most_nested_alloc_segment(
81
81
found =
82
82
critnib_find (hTracker -> alloc_segments_map [level ], (uintptr_t )ptr ,
83
83
FIND_LE , (void * )& rkey , (void * * )& rvalue );
84
- if (!found || ! rvalue ) {
84
+ if (!found ) {
85
85
break ;
86
86
}
87
87
88
+ // rvalue == NULL means that the entry was removed
89
+ if (rvalue == NULL ) {
90
+ // restart the search
91
+ parent_value = NULL ;
92
+ parent_key = 0 ;
93
+ rkey = 0 ;
94
+ rsize = 0 ;
95
+ level = 0 ;
96
+ found = 0 ;
97
+ continue ;
98
+ }
99
+
88
100
utils_atomic_load_acquire_u64 ((uint64_t * )& rvalue -> size , & rsize );
89
101
90
102
if (found && (uintptr_t )ptr < rkey + rsize ) {
@@ -195,10 +207,22 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
195
207
found =
196
208
critnib_find (hTracker -> alloc_segments_map [level ], (uintptr_t )ptr ,
197
209
FIND_LE , (void * )& rkey , (void * * )& rvalue );
198
- if (!found || ! rvalue ) {
210
+ if (!found ) {
199
211
break ;
200
212
}
201
213
214
+ // rvalue == NULL means that the entry was removed
215
+ if (rvalue == NULL ) {
216
+ // restart the search
217
+ parent_value = NULL ;
218
+ parent_key = 0 ;
219
+ rkey = 0 ;
220
+ rsize = 0 ;
221
+ level = 0 ;
222
+ found = 0 ;
223
+ continue ;
224
+ }
225
+
202
226
utils_atomic_load_acquire_u64 ((uint64_t * )& rvalue -> size , & rsize );
203
227
204
228
if ((uintptr_t )ptr < rkey + rsize ) {
@@ -383,6 +407,17 @@ umf_result_t umfMemoryTrackerGetAllocInfo(const void *ptr,
383
407
assert (level < MAX_LEVELS_OF_ALLOC_SEGMENT_MAP );
384
408
found = critnib_find (TRACKER -> alloc_segments_map [level ], (uintptr_t )ptr ,
385
409
FIND_LE , (void * )& rkey , (void * * )& rvalue );
410
+ // rvalue == NULL means that the entry was removed
411
+ if (found && (rvalue == NULL )) {
412
+ // restart the search
413
+ top_most_value = NULL ;
414
+ top_most_key = 0 ;
415
+ rkey = 0 ;
416
+ level = 0 ;
417
+ found = 0 ;
418
+ continue ;
419
+ }
420
+
386
421
if (found && (uintptr_t )ptr < rkey + rvalue -> size ) {
387
422
top_most_key = rkey ;
388
423
top_most_value = rvalue ;
@@ -428,8 +463,14 @@ umf_result_t umfMemoryTrackerGetIpcInfo(const void *ptr,
428
463
429
464
uintptr_t rkey ;
430
465
tracker_ipc_info_t * rvalue = NULL ;
431
- int found = critnib_find (TRACKER -> ipc_segments_map , (uintptr_t )ptr , FIND_LE ,
466
+ int found = 0 ;
467
+
468
+ do {
469
+ found = critnib_find (TRACKER -> ipc_segments_map , (uintptr_t )ptr , FIND_LE ,
432
470
(void * )& rkey , (void * * )& rvalue );
471
+ // rvalue == NULL means that the entry was removed
472
+ } while (found && (rvalue == NULL ));
473
+
433
474
if (!found || (uintptr_t )ptr >= rkey + rvalue -> size ) {
434
475
LOG_DEBUG ("pointer %p not found in the tracker, TRACKER=%p" , ptr ,
435
476
(void * )TRACKER );
@@ -768,6 +809,11 @@ static void check_if_tracker_is_empty(umf_memory_tracker_handle_t hTracker,
768
809
769
810
while (1 == critnib_find (hTracker -> alloc_segments_map [i ], last_key ,
770
811
FIND_G , & rkey , (void * * )& rvalue )) {
812
+ // rvalue == NULL means that the entry was removed
813
+ if (rvalue == NULL ) {
814
+ continue ;
815
+ }
816
+
771
817
if (rvalue -> pool == pool || pool == NULL ) {
772
818
n_items ++ ;
773
819
}
0 commit comments