28
28
29
29
uint64_t IPC_HANDLE_ID = 0 ;
30
30
31
- typedef struct tracker_value_t {
31
+ struct umf_memory_tracker_t {
32
+ umf_ba_pool_t * alloc_info_allocator ;
33
+ critnib * alloc_segments_map ;
34
+ utils_mutex_t splitMergeMutex ;
35
+ };
36
+
37
+ typedef struct tracker_alloc_info_t {
32
38
umf_memory_pool_handle_t pool ;
33
39
size_t size ;
34
- } tracker_value_t ;
40
+ } tracker_alloc_info_t ;
35
41
36
42
static umf_result_t umfMemoryTrackerAdd (umf_memory_tracker_handle_t hTracker ,
37
43
umf_memory_pool_handle_t pool ,
38
44
const void * ptr , size_t size ) {
39
45
assert (ptr );
40
46
41
- tracker_value_t * value = umf_ba_alloc (hTracker -> tracker_allocator );
47
+ tracker_alloc_info_t * value = umf_ba_alloc (hTracker -> alloc_info_allocator );
42
48
if (value == NULL ) {
43
49
LOG_ERR ("failed to allocate tracker value, ptr=%p, size=%zu" , ptr ,
44
50
size );
@@ -48,7 +54,8 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
48
54
value -> pool = pool ;
49
55
value -> size = size ;
50
56
51
- int ret = critnib_insert (hTracker -> map , (uintptr_t )ptr , value , 0 );
57
+ int ret =
58
+ critnib_insert (hTracker -> alloc_segments_map , (uintptr_t )ptr , value , 0 );
52
59
53
60
if (ret == 0 ) {
54
61
LOG_DEBUG (
@@ -60,7 +67,7 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
60
67
LOG_ERR ("failed to insert tracker value, ret=%d, ptr=%p, pool=%p, size=%zu" ,
61
68
ret , ptr , (void * )pool , size );
62
69
63
- umf_ba_free (hTracker -> tracker_allocator , value );
70
+ umf_ba_free (hTracker -> alloc_info_allocator , value );
64
71
65
72
if (ret == ENOMEM ) {
66
73
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
@@ -78,18 +85,18 @@ static umf_result_t umfMemoryTrackerRemove(umf_memory_tracker_handle_t hTracker,
78
85
// Every umfMemoryTrackerAdd(..., ptr, ...) should have a corresponding
79
86
// umfMemoryTrackerRemove call with the same ptr value.
80
87
81
- void * value = critnib_remove (hTracker -> map , (uintptr_t )ptr );
88
+ void * value = critnib_remove (hTracker -> alloc_segments_map , (uintptr_t )ptr );
82
89
if (!value ) {
83
- LOG_ERR ("pointer %p not found in the map " , ptr );
90
+ LOG_ERR ("pointer %p not found in the alloc_segments_map " , ptr );
84
91
return UMF_RESULT_ERROR_UNKNOWN ;
85
92
}
86
93
87
- tracker_value_t * v = value ;
94
+ tracker_alloc_info_t * v = value ;
88
95
89
96
LOG_DEBUG ("memory region removed: tracker=%p, ptr=%p, size=%zu" ,
90
97
(void * )hTracker , ptr , v -> size );
91
98
92
- umf_ba_free (hTracker -> tracker_allocator , value );
99
+ umf_ba_free (hTracker -> alloc_info_allocator , value );
93
100
94
101
return UMF_RESULT_SUCCESS ;
95
102
}
@@ -117,15 +124,15 @@ umf_result_t umfMemoryTrackerGetAllocInfo(const void *ptr,
117
124
return UMF_RESULT_ERROR_NOT_SUPPORTED ;
118
125
}
119
126
120
- if (TRACKER -> map == NULL ) {
121
- LOG_ERR ("tracker's map does not exist" );
127
+ if (TRACKER -> alloc_segments_map == NULL ) {
128
+ LOG_ERR ("tracker's alloc_segments_map does not exist" );
122
129
return UMF_RESULT_ERROR_NOT_SUPPORTED ;
123
130
}
124
131
125
132
uintptr_t rkey ;
126
- tracker_value_t * rvalue ;
127
- int found = critnib_find (TRACKER -> map , (uintptr_t )ptr , FIND_LE ,
128
- (void * )& rkey , (void * * )& rvalue );
133
+ tracker_alloc_info_t * rvalue ;
134
+ int found = critnib_find (TRACKER -> alloc_segments_map , (uintptr_t )ptr ,
135
+ FIND_LE , (void * )& rkey , (void * * )& rvalue );
129
136
if (!found || (uintptr_t )ptr >= rkey + rvalue -> size ) {
130
137
LOG_DEBUG ("pointer %p not found in the tracker, TRACKER=%p" , ptr ,
131
138
(void * )TRACKER );
@@ -188,8 +195,8 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
188
195
umf_tracking_memory_provider_t * provider =
189
196
(umf_tracking_memory_provider_t * )hProvider ;
190
197
191
- tracker_value_t * splitValue =
192
- umf_ba_alloc (provider -> hTracker -> tracker_allocator );
198
+ tracker_alloc_info_t * splitValue =
199
+ umf_ba_alloc (provider -> hTracker -> alloc_info_allocator );
193
200
if (!splitValue ) {
194
201
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
195
202
}
@@ -202,8 +209,8 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
202
209
goto err_lock ;
203
210
}
204
211
205
- tracker_value_t * value =
206
- ( tracker_value_t * ) critnib_get ( provider -> hTracker -> map , (uintptr_t )ptr );
212
+ tracker_alloc_info_t * value = ( tracker_alloc_info_t * ) critnib_get (
213
+ provider -> hTracker -> alloc_segments_map , (uintptr_t )ptr );
207
214
if (!value ) {
208
215
LOG_ERR ("region for split is not found in the tracker" );
209
216
ret = UMF_RESULT_ERROR_INVALID_ARGUMENT ;
@@ -240,22 +247,23 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
240
247
goto err ;
241
248
}
242
249
243
- int cret = critnib_insert (provider -> hTracker -> map , (uintptr_t )ptr ,
244
- (void * )splitValue , 1 /* update */ );
250
+ int cret =
251
+ critnib_insert (provider -> hTracker -> alloc_segments_map , (uintptr_t )ptr ,
252
+ (void * )splitValue , 1 /* update */ );
245
253
// this cannot fail since we know the element exists (nothing to allocate)
246
254
assert (cret == 0 );
247
255
(void )cret ;
248
256
249
257
// free the original value
250
- umf_ba_free (provider -> hTracker -> tracker_allocator , value );
258
+ umf_ba_free (provider -> hTracker -> alloc_info_allocator , value );
251
259
utils_mutex_unlock (& provider -> hTracker -> splitMergeMutex );
252
260
253
261
return UMF_RESULT_SUCCESS ;
254
262
255
263
err :
256
264
utils_mutex_unlock (& provider -> hTracker -> splitMergeMutex );
257
265
err_lock :
258
- umf_ba_free (provider -> hTracker -> tracker_allocator , splitValue );
266
+ umf_ba_free (provider -> hTracker -> alloc_info_allocator , splitValue );
259
267
return ret ;
260
268
}
261
269
@@ -265,8 +273,8 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
265
273
umf_tracking_memory_provider_t * provider =
266
274
(umf_tracking_memory_provider_t * )hProvider ;
267
275
268
- tracker_value_t * mergedValue =
269
- umf_ba_alloc (provider -> hTracker -> tracker_allocator );
276
+ tracker_alloc_info_t * mergedValue =
277
+ umf_ba_alloc (provider -> hTracker -> alloc_info_allocator );
270
278
271
279
if (!mergedValue ) {
272
280
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
@@ -280,15 +288,15 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
280
288
goto err_lock ;
281
289
}
282
290
283
- tracker_value_t * lowValue = (tracker_value_t * )critnib_get (
284
- provider -> hTracker -> map , (uintptr_t )lowPtr );
291
+ tracker_alloc_info_t * lowValue = (tracker_alloc_info_t * )critnib_get (
292
+ provider -> hTracker -> alloc_segments_map , (uintptr_t )lowPtr );
285
293
if (!lowValue ) {
286
294
LOG_ERR ("no left value" );
287
295
ret = UMF_RESULT_ERROR_INVALID_ARGUMENT ;
288
296
goto err ;
289
297
}
290
- tracker_value_t * highValue = (tracker_value_t * )critnib_get (
291
- provider -> hTracker -> map , (uintptr_t )highPtr );
298
+ tracker_alloc_info_t * highValue = (tracker_alloc_info_t * )critnib_get (
299
+ provider -> hTracker -> alloc_segments_map , (uintptr_t )highPtr );
292
300
if (!highValue ) {
293
301
LOG_ERR ("no right value" );
294
302
ret = UMF_RESULT_ERROR_INVALID_ARGUMENT ;
@@ -314,20 +322,21 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
314
322
315
323
// We'll have a duplicate entry for the range [highPtr, highValue->size] but this is fine,
316
324
// the value is the same anyway and we forbid removing that range concurrently
317
- int cret = critnib_insert (provider -> hTracker -> map , (uintptr_t )lowPtr ,
318
- (void * )mergedValue , 1 /* update */ );
325
+ int cret =
326
+ critnib_insert (provider -> hTracker -> alloc_segments_map ,
327
+ (uintptr_t )lowPtr , (void * )mergedValue , 1 /* update */ );
319
328
// this cannot fail since we know the element exists (nothing to allocate)
320
329
assert (cret == 0 );
321
330
(void )cret ;
322
331
323
332
// free old value that we just replaced with mergedValue
324
- umf_ba_free (provider -> hTracker -> tracker_allocator , lowValue );
333
+ umf_ba_free (provider -> hTracker -> alloc_info_allocator , lowValue );
325
334
326
- void * erasedhighValue =
327
- critnib_remove ( provider -> hTracker -> map , (uintptr_t )highPtr );
335
+ void * erasedhighValue = critnib_remove (
336
+ provider -> hTracker -> alloc_segments_map , (uintptr_t )highPtr );
328
337
assert (erasedhighValue == highValue );
329
338
330
- umf_ba_free (provider -> hTracker -> tracker_allocator , erasedhighValue );
339
+ umf_ba_free (provider -> hTracker -> alloc_info_allocator , erasedhighValue );
331
340
332
341
utils_mutex_unlock (& provider -> hTracker -> splitMergeMutex );
333
342
@@ -340,7 +349,7 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
340
349
utils_mutex_unlock (& provider -> hTracker -> splitMergeMutex );
341
350
342
351
err_lock :
343
- umf_ba_free (provider -> hTracker -> tracker_allocator , mergedValue );
352
+ umf_ba_free (provider -> hTracker -> alloc_info_allocator , mergedValue );
344
353
return ret ;
345
354
}
346
355
@@ -425,19 +434,20 @@ static void clear_tracker_for_the_pool(umf_memory_tracker_handle_t hTracker,
425
434
size_t n_items = 0 ;
426
435
uintptr_t last_key = 0 ;
427
436
428
- while (1 == critnib_find ((critnib * )hTracker -> map , last_key , FIND_G , & rkey ,
429
- & rvalue )) {
430
- tracker_value_t * value = (tracker_value_t * )rvalue ;
437
+ while (1 == critnib_find ((critnib * )hTracker -> alloc_segments_map , last_key ,
438
+ FIND_G , & rkey , & rvalue )) {
439
+ tracker_alloc_info_t * value = (tracker_alloc_info_t * )rvalue ;
431
440
if (value -> pool != pool && pool != NULL ) {
432
441
last_key = rkey ;
433
442
continue ;
434
443
}
435
444
436
445
n_items ++ ;
437
446
438
- void * removed_value = critnib_remove (hTracker -> map , rkey );
447
+ void * removed_value =
448
+ critnib_remove (hTracker -> alloc_segments_map , rkey );
439
449
assert (removed_value == rvalue );
440
- umf_ba_free (hTracker -> tracker_allocator , removed_value );
450
+ umf_ba_free (hTracker -> alloc_info_allocator , removed_value );
441
451
442
452
last_key = rkey ;
443
453
}
@@ -816,33 +826,33 @@ umf_memory_tracker_handle_t umfMemoryTrackerCreate(void) {
816
826
return NULL ;
817
827
}
818
828
819
- umf_ba_pool_t * tracker_allocator =
820
- umf_ba_create (sizeof (struct tracker_value_t ));
821
- if (!tracker_allocator ) {
829
+ umf_ba_pool_t * alloc_info_allocator =
830
+ umf_ba_create (sizeof (struct tracker_alloc_info_t ));
831
+ if (!alloc_info_allocator ) {
822
832
goto err_free_handle ;
823
833
}
824
834
825
- handle -> tracker_allocator = tracker_allocator ;
835
+ handle -> alloc_info_allocator = alloc_info_allocator ;
826
836
827
837
void * mutex_ptr = utils_mutex_init (& handle -> splitMergeMutex );
828
838
if (!mutex_ptr ) {
829
- goto err_destroy_tracker_allocator ;
839
+ goto err_destroy_alloc_info_allocator ;
830
840
}
831
841
832
- handle -> map = critnib_new ();
833
- if (!handle -> map ) {
842
+ handle -> alloc_segments_map = critnib_new ();
843
+ if (!handle -> alloc_segments_map ) {
834
844
goto err_destroy_mutex ;
835
845
}
836
846
837
- LOG_DEBUG ("tracker created, handle=%p, segment map =%p" , ( void * ) handle ,
838
- (void * )handle -> map );
847
+ LOG_DEBUG ("tracker created, handle=%p, alloc_segments_map =%p" ,
848
+ (void * )handle , ( void * ) handle -> alloc_segments_map );
839
849
840
850
return handle ;
841
851
842
852
err_destroy_mutex :
843
853
utils_mutex_destroy_not_free (& handle -> splitMergeMutex );
844
- err_destroy_tracker_allocator :
845
- umf_ba_destroy (tracker_allocator );
854
+ err_destroy_alloc_info_allocator :
855
+ umf_ba_destroy (alloc_info_allocator );
846
856
err_free_handle :
847
857
umf_ba_global_free (handle );
848
858
return NULL ;
@@ -865,10 +875,10 @@ void umfMemoryTrackerDestroy(umf_memory_tracker_handle_t handle) {
865
875
// We have to zero all inner pointers,
866
876
// because the tracker handle can be copied
867
877
// and used in many places.
868
- critnib_delete (handle -> map );
869
- handle -> map = NULL ;
878
+ critnib_delete (handle -> alloc_segments_map );
879
+ handle -> alloc_segments_map = NULL ;
870
880
utils_mutex_destroy_not_free (& handle -> splitMergeMutex );
871
- umf_ba_destroy (handle -> tracker_allocator );
872
- handle -> tracker_allocator = NULL ;
881
+ umf_ba_destroy (handle -> alloc_info_allocator );
882
+ handle -> alloc_info_allocator = NULL ;
873
883
umf_ba_global_free (handle );
874
884
}
0 commit comments