@@ -37,7 +37,7 @@ struct umf_memory_tracker_t {
37
37
// when one memory pool acts as a memory provider
38
38
// for another memory pool (nested memory pooling).
39
39
critnib * alloc_segments_map [MAX_LEVELS_OF_ALLOC_SEGMENT_MAP ];
40
- utils_mutex_t splitMergeMutex ;
40
+ utils_mutex_t mutex ;
41
41
};
42
42
43
43
typedef struct tracker_alloc_info_t {
@@ -179,6 +179,11 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
179
179
int level = 0 ;
180
180
int found = 0 ;
181
181
182
+ int ret = utils_mutex_lock (& hTracker -> mutex );
183
+ if (ret ) {
184
+ return UMF_RESULT_ERROR_UNKNOWN ;
185
+ }
186
+
182
187
// Find the most nested (in the highest level) entry
183
188
// in the critnib maps that contains the given 'ptr' pointer.
184
189
do {
@@ -197,7 +202,8 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
197
202
// TODO: we need to support an arbitrary amount of layers in the future
198
203
LOG_ERR ("tracker level is too high, ptr=%p, size=%zu" , ptr ,
199
204
size );
200
- return UMF_RESULT_ERROR_OUT_OF_RESOURCES ;
205
+ umf_result = UMF_RESULT_ERROR_OUT_OF_RESOURCES ;
206
+ goto err_unlock ;
201
207
}
202
208
if (((uintptr_t )ptr + size ) > (rkey + rsize )) {
203
209
LOG_ERR (
@@ -206,7 +212,8 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
206
212
"that exceeds the parent value (pool=%p, ptr=%p, size=%zu)" ,
207
213
(void * )pool , ptr , size , (void * )rvalue -> pool , (void * )rkey ,
208
214
(size_t )rsize );
209
- return UMF_RESULT_ERROR_INVALID_ARGUMENT ;
215
+ umf_result = UMF_RESULT_ERROR_INVALID_ARGUMENT ;
216
+ goto err_unlock ;
210
217
}
211
218
parent_key = rkey ;
212
219
parent_value = rvalue ;
@@ -217,10 +224,15 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
217
224
umf_result = umfMemoryTrackerAddAtLevel (hTracker , level , pool , ptr , size ,
218
225
parent_key , parent_value );
219
226
if (umf_result != UMF_RESULT_SUCCESS ) {
220
- return umf_result ;
227
+ goto err_unlock ;
221
228
}
222
229
223
- return UMF_RESULT_SUCCESS ;
230
+ umf_result = UMF_RESULT_SUCCESS ;
231
+
232
+ err_unlock :
233
+ utils_mutex_unlock (& hTracker -> mutex );
234
+
235
+ return umf_result ;
224
236
}
225
237
226
238
static umf_result_t umfMemoryTrackerRemove (umf_memory_tracker_handle_t hTracker ,
@@ -232,17 +244,23 @@ static umf_result_t umfMemoryTrackerRemove(umf_memory_tracker_handle_t hTracker,
232
244
// Every umfMemoryTrackerAdd(..., ptr, ...) should have a corresponding
233
245
// umfMemoryTrackerRemove call with the same ptr value.
234
246
247
+ umf_result_t umf_result = UMF_RESULT_ERROR_UNKNOWN ;
235
248
tracker_alloc_info_t * parent_value = NULL ;
236
249
uintptr_t parent_key = 0 ;
237
250
int level = 0 ;
238
251
252
+ int ret = utils_mutex_lock (& hTracker -> mutex );
253
+ if (ret ) {
254
+ return UMF_RESULT_ERROR_UNKNOWN ;
255
+ }
256
+
239
257
// Find the most nested (on the highest level) entry in the map
240
258
// with the `ptr` key and with no children - only such entry can be removed.
241
259
tracker_alloc_info_t * value = get_most_nested_alloc_segment (
242
260
hTracker , ptr , & level , & parent_key , & parent_value , 1 /* no_children */ );
243
261
if (!value ) {
244
262
LOG_ERR ("pointer %p not found in the alloc_segments_map" , ptr );
245
- return UMF_RESULT_ERROR_UNKNOWN ;
263
+ goto err_unlock ;
246
264
}
247
265
248
266
assert (level < MAX_LEVELS_OF_ALLOC_SEGMENT_MAP );
@@ -264,7 +282,12 @@ static umf_result_t umfMemoryTrackerRemove(umf_memory_tracker_handle_t hTracker,
264
282
265
283
umf_ba_free (hTracker -> alloc_info_allocator , value );
266
284
267
- return UMF_RESULT_SUCCESS ;
285
+ umf_result = UMF_RESULT_SUCCESS ;
286
+
287
+ err_unlock :
288
+ utils_mutex_unlock (& hTracker -> mutex );
289
+
290
+ return umf_result ;
268
291
}
269
292
270
293
umf_memory_pool_handle_t umfMemoryTrackerGetPool (const void * ptr ) {
@@ -404,7 +427,7 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
404
427
splitValue -> size = firstSize ;
405
428
splitValue -> n_children = 0 ;
406
429
407
- int r = utils_mutex_lock (& provider -> hTracker -> splitMergeMutex );
430
+ int r = utils_mutex_lock (& provider -> hTracker -> mutex );
408
431
if (r ) {
409
432
goto err_lock ;
410
433
}
@@ -470,7 +493,7 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
470
493
471
494
// free the original value
472
495
umf_ba_free (provider -> hTracker -> alloc_info_allocator , value );
473
- utils_mutex_unlock (& provider -> hTracker -> splitMergeMutex );
496
+ utils_mutex_unlock (& provider -> hTracker -> mutex );
474
497
475
498
LOG_DEBUG (
476
499
"split memory region (level=%i): ptr=%p, totalSize=%zu, firstSize=%zu" ,
@@ -479,7 +502,7 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
479
502
return UMF_RESULT_SUCCESS ;
480
503
481
504
err :
482
- utils_mutex_unlock (& provider -> hTracker -> splitMergeMutex );
505
+ utils_mutex_unlock (& provider -> hTracker -> mutex );
483
506
err_lock :
484
507
umf_ba_free (provider -> hTracker -> alloc_info_allocator , splitValue );
485
508
@@ -511,7 +534,7 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
511
534
int lowLevel = -2 ;
512
535
int highLevel = -1 ;
513
536
514
- int r = utils_mutex_lock (& provider -> hTracker -> splitMergeMutex );
537
+ int r = utils_mutex_lock (& provider -> hTracker -> mutex );
515
538
if (r ) {
516
539
goto err_lock ;
517
540
}
@@ -578,7 +601,7 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
578
601
579
602
umf_ba_free (provider -> hTracker -> alloc_info_allocator , erasedhighValue );
580
603
581
- utils_mutex_unlock (& provider -> hTracker -> splitMergeMutex );
604
+ utils_mutex_unlock (& provider -> hTracker -> mutex );
582
605
583
606
LOG_DEBUG ("merged memory regions (level=%i): lowPtr=%p (child=%zu), "
584
607
"highPtr=%p (child=%zu), totalSize=%zu" ,
@@ -593,7 +616,7 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
593
616
assert (0 );
594
617
595
618
not_merged :
596
- utils_mutex_unlock (& provider -> hTracker -> splitMergeMutex );
619
+ utils_mutex_unlock (& provider -> hTracker -> mutex );
597
620
598
621
err_lock :
599
622
umf_ba_free (provider -> hTracker -> alloc_info_allocator , mergedValue );
@@ -1077,7 +1100,7 @@ umf_memory_tracker_handle_t umfMemoryTrackerCreate(void) {
1077
1100
1078
1101
handle -> alloc_info_allocator = alloc_info_allocator ;
1079
1102
1080
- void * mutex_ptr = utils_mutex_init (& handle -> splitMergeMutex );
1103
+ void * mutex_ptr = utils_mutex_init (& handle -> mutex );
1081
1104
if (!mutex_ptr ) {
1082
1105
goto err_destroy_alloc_info_allocator ;
1083
1106
}
@@ -1101,7 +1124,7 @@ umf_memory_tracker_handle_t umfMemoryTrackerCreate(void) {
1101
1124
critnib_delete (handle -> alloc_segments_map [j ]);
1102
1125
}
1103
1126
}
1104
- utils_mutex_destroy_not_free (& handle -> splitMergeMutex );
1127
+ utils_mutex_destroy_not_free (& handle -> mutex );
1105
1128
err_destroy_alloc_info_allocator :
1106
1129
umf_ba_destroy (alloc_info_allocator );
1107
1130
err_free_handle :
@@ -1134,7 +1157,7 @@ void umfMemoryTrackerDestroy(umf_memory_tracker_handle_t handle) {
1134
1157
handle -> alloc_segments_map [i ] = NULL ;
1135
1158
}
1136
1159
}
1137
- utils_mutex_destroy_not_free (& handle -> splitMergeMutex );
1160
+ utils_mutex_destroy_not_free (& handle -> mutex );
1138
1161
umf_ba_destroy (handle -> alloc_info_allocator );
1139
1162
handle -> alloc_info_allocator = NULL ;
1140
1163
umf_ba_global_free (handle );
0 commit comments