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 );
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 -> tracker_allocator , 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 -> tracker_allocator , value );
72
68
73
69
return UMF_RESULT_SUCCESS ;
74
70
}
@@ -129,15 +125,15 @@ 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 -> tracker_allocator );
133
129
if (!splitValue ) {
134
130
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
135
131
}
136
132
137
133
splitValue -> pool = provider -> pool ;
138
134
splitValue -> size = firstSize ;
139
135
140
- int r = util_mutex_lock (provider -> hTracker -> splitMergeMutex );
136
+ int r = util_mutex_lock (& provider -> hTracker -> splitMergeMutex );
141
137
if (r ) {
142
138
goto err_lock ;
143
139
}
@@ -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 );
189
- util_mutex_unlock (provider -> hTracker -> splitMergeMutex );
184
+ umf_ba_free ( provider -> hTracker -> tracker_allocator , value );
185
+ util_mutex_unlock (& provider -> hTracker -> splitMergeMutex );
190
186
191
187
return UMF_RESULT_SUCCESS ;
192
188
193
189
err :
194
- util_mutex_unlock (provider -> hTracker -> splitMergeMutex );
190
+ util_mutex_unlock (& provider -> hTracker -> splitMergeMutex );
195
191
err_lock :
196
- free ( splitValue );
192
+ umf_ba_free ( provider -> hTracker -> tracker_allocator , splitValue );
197
193
return ret ;
198
194
}
199
195
@@ -204,15 +200,16 @@ 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 -> tracker_allocator );
204
+
208
205
if (!mergedValue ) {
209
206
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
210
207
}
211
208
212
209
mergedValue -> pool = provider -> pool ;
213
210
mergedValue -> size = totalSize ;
214
211
215
- int r = util_mutex_lock (provider -> hTracker -> splitMergeMutex );
212
+ int r = util_mutex_lock (& provider -> hTracker -> splitMergeMutex );
216
213
if (r ) {
217
214
goto err_lock ;
218
215
}
@@ -260,22 +257,22 @@ 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 -> tracker_allocator , 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 -> tracker_allocator , erasedhighValue );
270
267
271
- util_mutex_unlock (provider -> hTracker -> splitMergeMutex );
268
+ util_mutex_unlock (& provider -> hTracker -> splitMergeMutex );
272
269
273
270
return UMF_RESULT_SUCCESS ;
274
271
275
272
err :
276
- util_mutex_unlock (provider -> hTracker -> splitMergeMutex );
273
+ util_mutex_unlock (& provider -> hTracker -> splitMergeMutex );
277
274
err_lock :
278
- free ( mergedValue );
275
+ umf_ba_free ( provider -> hTracker -> tracker_allocator , 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