@@ -30,7 +30,12 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
30
30
const void * ptr , size_t size ) {
31
31
assert (ptr );
32
32
33
- tracker_value_t * value = (tracker_value_t * )malloc (sizeof (tracker_value_t ));
33
+ tracker_value_t * value =
34
+ (tracker_value_t * )umf_ba_alloc (hTracker -> tracker_allocator );
35
+ if (value == NULL ) {
36
+ return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
37
+ }
38
+
34
39
value -> pool = pool ;
35
40
value -> size = size ;
36
41
@@ -40,7 +45,7 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
40
45
return UMF_RESULT_SUCCESS ;
41
46
}
42
47
43
- free ( value );
48
+ umf_ba_free ( hTracker -> tracker_allocator , value );
44
49
45
50
if (ret == ENOMEM ) {
46
51
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
@@ -68,7 +73,7 @@ static umf_result_t umfMemoryTrackerRemove(umf_memory_tracker_handle_t hTracker,
68
73
return UMF_RESULT_ERROR_UNKNOWN ;
69
74
}
70
75
71
- free ( value );
76
+ umf_ba_free ( hTracker -> tracker_allocator , value );
72
77
73
78
return UMF_RESULT_SUCCESS ;
74
79
}
@@ -128,15 +133,15 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
128
133
(umf_tracking_memory_provider_t * )hProvider ;
129
134
130
135
tracker_value_t * splitValue =
131
- (tracker_value_t * )malloc ( sizeof ( tracker_value_t ) );
136
+ (tracker_value_t * )umf_ba_alloc ( provider -> hTracker -> tracker_allocator );
132
137
if (!splitValue ) {
133
138
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
134
139
}
135
140
136
141
splitValue -> pool = provider -> pool ;
137
142
splitValue -> size = firstSize ;
138
143
139
- int r = util_mutex_lock (provider -> hTracker -> splitMergeMutex );
144
+ int r = util_mutex_lock (& provider -> hTracker -> splitMergeMutex );
140
145
if (r ) {
141
146
goto err_lock ;
142
147
}
@@ -184,15 +189,15 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
184
189
(void )cret ;
185
190
186
191
// free the original value
187
- free ( value );
188
- util_mutex_unlock (provider -> hTracker -> splitMergeMutex );
192
+ umf_ba_free ( provider -> hTracker -> tracker_allocator , value );
193
+ util_mutex_unlock (& provider -> hTracker -> splitMergeMutex );
189
194
190
195
return UMF_RESULT_SUCCESS ;
191
196
192
197
err :
193
- util_mutex_unlock (provider -> hTracker -> splitMergeMutex );
198
+ util_mutex_unlock (& provider -> hTracker -> splitMergeMutex );
194
199
err_lock :
195
- free ( splitValue );
200
+ umf_ba_free ( provider -> hTracker -> tracker_allocator , splitValue );
196
201
return ret ;
197
202
}
198
203
@@ -203,15 +208,16 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
203
208
(umf_tracking_memory_provider_t * )hProvider ;
204
209
205
210
tracker_value_t * mergedValue =
206
- (tracker_value_t * )malloc (sizeof (tracker_value_t ));
211
+ (tracker_value_t * )umf_ba_alloc (provider -> hTracker -> tracker_allocator );
212
+
207
213
if (!mergedValue ) {
208
214
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
209
215
}
210
216
211
217
mergedValue -> pool = provider -> pool ;
212
218
mergedValue -> size = totalSize ;
213
219
214
- int r = util_mutex_lock (provider -> hTracker -> splitMergeMutex );
220
+ int r = util_mutex_lock (& provider -> hTracker -> splitMergeMutex );
215
221
if (r ) {
216
222
goto err_lock ;
217
223
}
@@ -259,22 +265,22 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
259
265
(void )cret ;
260
266
261
267
// free old value that we just replaced with mergedValue
262
- free ( lowValue );
268
+ umf_ba_free ( provider -> hTracker -> tracker_allocator , lowValue );
263
269
264
270
void * erasedhighValue =
265
271
critnib_remove (provider -> hTracker -> map , (uintptr_t )highPtr );
266
272
assert (erasedhighValue == highValue );
267
273
268
- free ( erasedhighValue );
274
+ umf_ba_free ( provider -> hTracker -> tracker_allocator , erasedhighValue );
269
275
270
- util_mutex_unlock (provider -> hTracker -> splitMergeMutex );
276
+ util_mutex_unlock (& provider -> hTracker -> splitMergeMutex );
271
277
272
278
return UMF_RESULT_SUCCESS ;
273
279
274
280
err :
275
- util_mutex_unlock (provider -> hTracker -> splitMergeMutex );
281
+ util_mutex_unlock (& provider -> hTracker -> splitMergeMutex );
276
282
err_lock :
277
- free ( mergedValue );
283
+ umf_ba_free ( provider -> hTracker -> tracker_allocator , mergedValue );
278
284
return ret ;
279
285
}
280
286
@@ -309,9 +315,11 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
309
315
}
310
316
311
317
static umf_result_t trackingInitialize (void * params , void * * ret ) {
318
+ umf_tracking_memory_provider_t * p =
319
+ (umf_tracking_memory_provider_t * )params ;
312
320
umf_tracking_memory_provider_t * provider =
313
- (umf_tracking_memory_provider_t * )malloc (
314
- sizeof (umf_tracking_memory_provider_t ));
321
+ (umf_tracking_memory_provider_t * )umf_ba_linear_alloc (
322
+ p -> hTracker -> pool_linear , sizeof (umf_tracking_memory_provider_t ));
315
323
if (!provider ) {
316
324
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
317
325
}
@@ -363,7 +371,10 @@ static void trackingFinalize(void *provider) {
363
371
check_if_tracker_is_empty (p -> hTracker , p -> pool );
364
372
#endif /* NDEBUG */
365
373
366
- free (provider );
374
+ (void )provider ; // unused in Release build
375
+ // provider was allocated from the linear allocator,
376
+ // so it will be freed, when the linear allocator is destroyed
377
+ // in umfMemoryTrackerDestroy()
367
378
}
368
379
369
380
static void trackingGetLastError (void * provider , const char * * msg ,
@@ -447,26 +458,47 @@ void umfTrackingMemoryProviderGetUpstreamProvider(
447
458
}
448
459
449
460
umf_memory_tracker_handle_t umfMemoryTrackerCreate (void ) {
450
- umf_memory_tracker_handle_t handle = ( umf_memory_tracker_handle_t ) malloc (
451
- sizeof ( struct umf_memory_tracker_t ) );
452
- if (!handle ) {
461
+ umf_ba_linear_pool_t * pool_linear =
462
+ umf_ba_linear_create ( 0 /* minimum pool size */ );
463
+ if (!pool_linear ) {
453
464
return NULL ;
454
465
}
455
466
456
- handle -> map = critnib_new ();
457
- if (! handle -> map ) {
458
- free ( handle );
459
- return NULL ;
467
+ umf_ba_pool_t * tracker_allocator =
468
+ umf_ba_create ( sizeof ( struct tracker_value_t ));
469
+ if (! tracker_allocator ) {
470
+ goto err_destroy_pool_linear ;
460
471
}
461
472
462
- handle -> splitMergeMutex = util_mutex_create ();
463
- if (!handle -> splitMergeMutex ) {
464
- critnib_delete (handle -> map );
465
- free (handle );
466
- return NULL ;
473
+ umf_memory_tracker_handle_t handle =
474
+ (umf_memory_tracker_handle_t )umf_ba_linear_alloc (
475
+ pool_linear , sizeof (struct umf_memory_tracker_t ));
476
+ if (!handle ) {
477
+ goto err_destroy_tracker_allocator ;
478
+ }
479
+
480
+ handle -> pool_linear = pool_linear ;
481
+ handle -> tracker_allocator = tracker_allocator ;
482
+
483
+ void * mutex_ptr = util_mutex_init (& handle -> splitMergeMutex );
484
+ if (!mutex_ptr ) {
485
+ goto err_destroy_tracker_allocator ;
486
+ }
487
+
488
+ handle -> map = critnib_new ();
489
+ if (!handle -> map ) {
490
+ goto err_destroy_mutex ;
467
491
}
468
492
469
493
return handle ;
494
+
495
+ err_destroy_mutex :
496
+ util_mutex_destroy_not_free (& handle -> splitMergeMutex );
497
+ err_destroy_tracker_allocator :
498
+ umf_ba_destroy (tracker_allocator );
499
+ err_destroy_pool_linear :
500
+ umf_ba_linear_destroy (pool_linear );
501
+ return NULL ;
470
502
}
471
503
472
504
void umfMemoryTrackerDestroy (umf_memory_tracker_handle_t handle ) {
@@ -479,6 +511,7 @@ void umfMemoryTrackerDestroy(umf_memory_tracker_handle_t handle) {
479
511
#endif /* NDEBUG */
480
512
481
513
critnib_delete (handle -> map );
482
- util_mutex_destroy (handle -> splitMergeMutex );
483
- free (handle );
514
+ util_mutex_destroy_not_free (& handle -> splitMergeMutex );
515
+ umf_ba_destroy (handle -> tracker_allocator );
516
+ umf_ba_linear_destroy (handle -> pool_linear );
484
517
}
0 commit comments