20
20
#include <stdio.h>
21
21
#include <stdlib.h>
22
22
23
- typedef struct tracker_value_t {
24
- umf_memory_pool_handle_t pool ;
25
- size_t size ;
26
- } tracker_value_t ;
27
-
28
23
static umf_result_t umfMemoryTrackerAdd (umf_memory_tracker_handle_t hTracker ,
29
24
umf_memory_pool_handle_t pool ,
30
25
const void * ptr , size_t size ) {
31
26
assert (ptr );
32
27
33
- tracker_value_t * value = (tracker_value_t * )malloc (sizeof (tracker_value_t ));
28
+ tracker_value_t * value =
29
+ (tracker_value_t * )umf_ba_alloc (hTracker -> pool_tracker );
34
30
value -> pool = pool ;
35
31
value -> size = size ;
36
32
@@ -40,7 +36,7 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
40
36
return UMF_RESULT_SUCCESS ;
41
37
}
42
38
43
- free ( value );
39
+ umf_ba_free ( hTracker -> pool_tracker , value );
44
40
45
41
if (ret == ENOMEM ) {
46
42
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
@@ -68,7 +64,7 @@ static umf_result_t umfMemoryTrackerRemove(umf_memory_tracker_handle_t hTracker,
68
64
return UMF_RESULT_ERROR_UNKNOWN ;
69
65
}
70
66
71
- free ( value );
67
+ umf_ba_free ( hTracker -> pool_tracker , value );
72
68
73
69
return UMF_RESULT_SUCCESS ;
74
70
}
@@ -129,7 +125,7 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
129
125
(umf_tracking_memory_provider_t * )hProvider ;
130
126
131
127
tracker_value_t * splitValue =
132
- (tracker_value_t * )malloc ( sizeof ( tracker_value_t ) );
128
+ (tracker_value_t * )umf_ba_alloc ( provider -> hTracker -> pool_tracker );
133
129
if (!splitValue ) {
134
130
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
135
131
}
@@ -185,15 +181,15 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
185
181
(void )cret ;
186
182
187
183
// free the original value
188
- free ( value );
184
+ umf_ba_free ( provider -> hTracker -> pool_tracker , value );
189
185
util_mutex_unlock (provider -> hTracker -> splitMergeMutex );
190
186
191
187
return UMF_RESULT_SUCCESS ;
192
188
193
189
err :
194
190
util_mutex_unlock (provider -> hTracker -> splitMergeMutex );
195
191
err_lock :
196
- free ( splitValue );
192
+ umf_ba_free ( provider -> hTracker -> pool_tracker , splitValue );
197
193
return ret ;
198
194
}
199
195
@@ -204,7 +200,8 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
204
200
(umf_tracking_memory_provider_t * )hProvider ;
205
201
206
202
tracker_value_t * mergedValue =
207
- (tracker_value_t * )malloc (sizeof (tracker_value_t ));
203
+ (tracker_value_t * )umf_ba_alloc (provider -> hTracker -> pool_tracker );
204
+
208
205
if (!mergedValue ) {
209
206
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
210
207
}
@@ -260,13 +257,13 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
260
257
(void )cret ;
261
258
262
259
// free old value that we just replaced with mergedValue
263
- free ( lowValue );
260
+ umf_ba_free ( provider -> hTracker -> pool_tracker , lowValue );
264
261
265
262
void * erasedhighValue =
266
263
critnib_remove (provider -> hTracker -> map , (uintptr_t )highPtr );
267
264
assert (erasedhighValue == highValue );
268
265
269
- free ( erasedhighValue );
266
+ umf_ba_free ( provider -> hTracker -> pool_tracker , erasedhighValue );
270
267
271
268
util_mutex_unlock (provider -> hTracker -> splitMergeMutex );
272
269
@@ -275,7 +272,7 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
275
272
err :
276
273
util_mutex_unlock (provider -> hTracker -> splitMergeMutex );
277
274
err_lock :
278
- free ( mergedValue );
275
+ umf_ba_free ( provider -> hTracker -> pool_tracker , mergedValue );
279
276
return ret ;
280
277
}
281
278
@@ -310,9 +307,11 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
310
307
}
311
308
312
309
static umf_result_t trackingInitialize (void * params , void * * ret ) {
310
+ umf_tracking_memory_provider_t * p =
311
+ (umf_tracking_memory_provider_t * )params ;
313
312
umf_tracking_memory_provider_t * provider =
314
- (umf_tracking_memory_provider_t * )malloc (
315
- sizeof (umf_tracking_memory_provider_t ));
313
+ (umf_tracking_memory_provider_t * )umf_ba_linear_alloc (
314
+ p -> hTracker -> pool_linear , sizeof (umf_tracking_memory_provider_t ));
316
315
if (!provider ) {
317
316
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
318
317
}
@@ -364,7 +363,10 @@ static void trackingFinalize(void *provider) {
364
363
check_if_tracker_is_empty (p -> hTracker , p -> pool );
365
364
#endif /* NDEBUG */
366
365
367
- free (provider );
366
+ (void )provider ; // unused in Release build
367
+ // provider was allocated from the linear allocator,
368
+ // so it will be freed, when the linear allocator is destroyed
369
+ // in umfMemoryTrackerDestroy()
368
370
}
369
371
370
372
static void trackingGetLastError (void * provider , const char * * msg ,
0 commit comments