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 -> tracker_allocator );
30
+ if (value == NULL ) {
31
+ return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
32
+ }
33
+
34
34
value -> pool = pool ;
35
35
value -> size = size ;
36
36
@@ -40,7 +40,7 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
40
40
return UMF_RESULT_SUCCESS ;
41
41
}
42
42
43
- free ( value );
43
+ umf_ba_free ( hTracker -> tracker_allocator , value );
44
44
45
45
if (ret == ENOMEM ) {
46
46
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
@@ -68,7 +68,7 @@ static umf_result_t umfMemoryTrackerRemove(umf_memory_tracker_handle_t hTracker,
68
68
return UMF_RESULT_ERROR_UNKNOWN ;
69
69
}
70
70
71
- free ( value );
71
+ umf_ba_free ( hTracker -> tracker_allocator , value );
72
72
73
73
return UMF_RESULT_SUCCESS ;
74
74
}
@@ -129,15 +129,15 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
129
129
(umf_tracking_memory_provider_t * )hProvider ;
130
130
131
131
tracker_value_t * splitValue =
132
- (tracker_value_t * )malloc ( sizeof ( tracker_value_t ) );
132
+ (tracker_value_t * )umf_ba_alloc ( provider -> hTracker -> tracker_allocator );
133
133
if (!splitValue ) {
134
134
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
135
135
}
136
136
137
137
splitValue -> pool = provider -> pool ;
138
138
splitValue -> size = firstSize ;
139
139
140
- int r = util_mutex_lock (provider -> hTracker -> splitMergeMutex );
140
+ int r = util_mutex_lock (& provider -> hTracker -> splitMergeMutex );
141
141
if (r ) {
142
142
goto err_lock ;
143
143
}
@@ -185,15 +185,15 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
185
185
(void )cret ;
186
186
187
187
// free the original value
188
- free ( value );
189
- util_mutex_unlock (provider -> hTracker -> splitMergeMutex );
188
+ umf_ba_free ( provider -> hTracker -> tracker_allocator , value );
189
+ util_mutex_unlock (& provider -> hTracker -> splitMergeMutex );
190
190
191
191
return UMF_RESULT_SUCCESS ;
192
192
193
193
err :
194
- util_mutex_unlock (provider -> hTracker -> splitMergeMutex );
194
+ util_mutex_unlock (& provider -> hTracker -> splitMergeMutex );
195
195
err_lock :
196
- free ( splitValue );
196
+ umf_ba_free ( provider -> hTracker -> tracker_allocator , splitValue );
197
197
return ret ;
198
198
}
199
199
@@ -204,15 +204,16 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
204
204
(umf_tracking_memory_provider_t * )hProvider ;
205
205
206
206
tracker_value_t * mergedValue =
207
- (tracker_value_t * )malloc (sizeof (tracker_value_t ));
207
+ (tracker_value_t * )umf_ba_alloc (provider -> hTracker -> tracker_allocator );
208
+
208
209
if (!mergedValue ) {
209
210
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
210
211
}
211
212
212
213
mergedValue -> pool = provider -> pool ;
213
214
mergedValue -> size = totalSize ;
214
215
215
- int r = util_mutex_lock (provider -> hTracker -> splitMergeMutex );
216
+ int r = util_mutex_lock (& provider -> hTracker -> splitMergeMutex );
216
217
if (r ) {
217
218
goto err_lock ;
218
219
}
@@ -260,22 +261,22 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
260
261
(void )cret ;
261
262
262
263
// free old value that we just replaced with mergedValue
263
- free ( lowValue );
264
+ umf_ba_free ( provider -> hTracker -> tracker_allocator , lowValue );
264
265
265
266
void * erasedhighValue =
266
267
critnib_remove (provider -> hTracker -> map , (uintptr_t )highPtr );
267
268
assert (erasedhighValue == highValue );
268
269
269
- free ( erasedhighValue );
270
+ umf_ba_free ( provider -> hTracker -> tracker_allocator , erasedhighValue );
270
271
271
- util_mutex_unlock (provider -> hTracker -> splitMergeMutex );
272
+ util_mutex_unlock (& provider -> hTracker -> splitMergeMutex );
272
273
273
274
return UMF_RESULT_SUCCESS ;
274
275
275
276
err :
276
- util_mutex_unlock (provider -> hTracker -> splitMergeMutex );
277
+ util_mutex_unlock (& provider -> hTracker -> splitMergeMutex );
277
278
err_lock :
278
- free ( mergedValue );
279
+ umf_ba_free ( provider -> hTracker -> tracker_allocator , mergedValue );
279
280
return ret ;
280
281
}
281
282
@@ -310,9 +311,11 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
310
311
}
311
312
312
313
static umf_result_t trackingInitialize (void * params , void * * ret ) {
314
+ umf_tracking_memory_provider_t * p =
315
+ (umf_tracking_memory_provider_t * )params ;
313
316
umf_tracking_memory_provider_t * provider =
314
- (umf_tracking_memory_provider_t * )malloc (
315
- sizeof (umf_tracking_memory_provider_t ));
317
+ (umf_tracking_memory_provider_t * )umf_ba_linear_alloc (
318
+ p -> hTracker -> pool_linear , sizeof (umf_tracking_memory_provider_t ));
316
319
if (!provider ) {
317
320
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
318
321
}
@@ -364,7 +367,10 @@ static void trackingFinalize(void *provider) {
364
367
check_if_tracker_is_empty (p -> hTracker , p -> pool );
365
368
#endif /* NDEBUG */
366
369
367
- free (provider );
370
+ (void )provider ; // unused in Release build
371
+ // provider was allocated from the linear allocator,
372
+ // so it will be freed, when the linear allocator is destroyed
373
+ // in umfMemoryTrackerDestroy()
368
374
}
369
375
370
376
static void trackingGetLastError (void * provider , const char * * msg ,
0 commit comments