8
8
*/
9
9
10
10
#include "provider_tracking.h"
11
+ #include "base_alloc.h"
11
12
#include "critnib.h"
12
13
#include "utils_concurrency.h"
13
14
@@ -27,10 +28,11 @@ typedef struct tracker_value_t {
27
28
28
29
static umf_result_t umfMemoryTrackerAdd (umf_memory_tracker_handle_t hTracker ,
29
30
umf_memory_pool_handle_t pool ,
30
- const void * ptr , size_t size ) {
31
+ umf_ba_pool_t * ba_pool , const void * ptr ,
32
+ size_t size ) {
31
33
assert (ptr );
32
34
33
- tracker_value_t * value = (tracker_value_t * )malloc ( sizeof ( tracker_value_t ) );
35
+ tracker_value_t * value = (tracker_value_t * )umf_ba_alloc ( ba_pool );
34
36
value -> pool = pool ;
35
37
value -> size = size ;
36
38
@@ -40,7 +42,7 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
40
42
return UMF_RESULT_SUCCESS ;
41
43
}
42
44
43
- free ( value );
45
+ umf_ba_free ( ba_pool , value );
44
46
45
47
if (ret == ENOMEM ) {
46
48
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
@@ -52,6 +54,7 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
52
54
}
53
55
54
56
static umf_result_t umfMemoryTrackerRemove (umf_memory_tracker_handle_t hTracker ,
57
+ umf_ba_pool_t * ba_pool ,
55
58
const void * ptr , size_t size ) {
56
59
assert (ptr );
57
60
@@ -68,7 +71,7 @@ static umf_result_t umfMemoryTrackerRemove(umf_memory_tracker_handle_t hTracker,
68
71
return UMF_RESULT_ERROR_UNKNOWN ;
69
72
}
70
73
71
- free ( value );
74
+ umf_ba_free ( ba_pool , value );
72
75
73
76
return UMF_RESULT_SUCCESS ;
74
77
}
@@ -92,6 +95,7 @@ typedef struct umf_tracking_memory_provider_t {
92
95
umf_memory_provider_handle_t hUpstream ;
93
96
umf_memory_tracker_handle_t hTracker ;
94
97
umf_memory_pool_handle_t pool ;
98
+ umf_ba_pool_t * ba_pool ;
95
99
} umf_tracking_memory_provider_t ;
96
100
97
101
typedef struct umf_tracking_memory_provider_t umf_tracking_memory_provider_t ;
@@ -111,7 +115,8 @@ static umf_result_t trackingAlloc(void *hProvider, size_t size,
111
115
return ret ;
112
116
}
113
117
114
- umf_result_t ret2 = umfMemoryTrackerAdd (p -> hTracker , p -> pool , * ptr , size );
118
+ umf_result_t ret2 =
119
+ umfMemoryTrackerAdd (p -> hTracker , p -> pool , p -> ba_pool , * ptr , size );
115
120
if (ret2 != UMF_RESULT_SUCCESS ) {
116
121
// DO NOT call umfMemoryProviderFree() here, because the tracking provider
117
122
// cannot change behaviour of the upstream provider.
@@ -129,7 +134,7 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
129
134
(umf_tracking_memory_provider_t * )hProvider ;
130
135
131
136
tracker_value_t * splitValue =
132
- (tracker_value_t * )malloc ( sizeof ( tracker_value_t ) );
137
+ (tracker_value_t * )umf_ba_alloc ( provider -> ba_pool );
133
138
if (!splitValue ) {
134
139
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
135
140
}
@@ -168,8 +173,8 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
168
173
169
174
// We'll have a duplicate entry for the range [highPtr, highValue->size] but this is fine,
170
175
// the value is the same anyway and we forbid removing that range concurrently
171
- ret = umfMemoryTrackerAdd (provider -> hTracker , provider -> pool , highPtr ,
172
- secondSize );
176
+ ret = umfMemoryTrackerAdd (provider -> hTracker , provider -> pool ,
177
+ provider -> ba_pool , highPtr , secondSize );
173
178
if (ret != UMF_RESULT_SUCCESS ) {
174
179
fprintf (stderr , "tracking split: umfMemoryTrackerAdd failed\n" );
175
180
// TODO: what now? should we rollback the split? This can only happen due to ENOMEM
@@ -185,15 +190,15 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
185
190
(void )cret ;
186
191
187
192
// free the original value
188
- free ( value );
193
+ umf_ba_free ( provider -> ba_pool , value );
189
194
util_mutex_unlock (provider -> hTracker -> splitMergeMutex );
190
195
191
196
return UMF_RESULT_SUCCESS ;
192
197
193
198
err :
194
199
util_mutex_unlock (provider -> hTracker -> splitMergeMutex );
195
200
err_lock :
196
- free ( splitValue );
201
+ umf_ba_free ( provider -> ba_pool , splitValue );
197
202
return ret ;
198
203
}
199
204
@@ -204,7 +209,8 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
204
209
(umf_tracking_memory_provider_t * )hProvider ;
205
210
206
211
tracker_value_t * mergedValue =
207
- (tracker_value_t * )malloc (sizeof (tracker_value_t ));
212
+ (tracker_value_t * )umf_ba_alloc (provider -> ba_pool );
213
+ ;
208
214
if (!mergedValue ) {
209
215
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY ;
210
216
}
@@ -260,13 +266,13 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
260
266
(void )cret ;
261
267
262
268
// free old value that we just replaced with mergedValue
263
- free ( lowValue );
269
+ umf_ba_free ( provider -> ba_pool , lowValue );
264
270
265
271
void * erasedhighValue =
266
272
critnib_remove (provider -> hTracker -> map , (uintptr_t )highPtr );
267
273
assert (erasedhighValue == highValue );
268
274
269
- free ( erasedhighValue );
275
+ umf_ba_free ( provider -> ba_pool , erasedhighValue );
270
276
271
277
util_mutex_unlock (provider -> hTracker -> splitMergeMutex );
272
278
@@ -275,7 +281,7 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
275
281
err :
276
282
util_mutex_unlock (provider -> hTracker -> splitMergeMutex );
277
283
err_lock :
278
- free ( mergedValue );
284
+ umf_ba_free ( provider -> ba_pool , mergedValue );
279
285
return ret ;
280
286
}
281
287
@@ -289,7 +295,7 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
289
295
// could allocate the memory at address `ptr` before a call to umfMemoryTrackerRemove
290
296
// resulting in inconsistent state.
291
297
if (ptr ) {
292
- ret = umfMemoryTrackerRemove (p -> hTracker , ptr , size );
298
+ ret = umfMemoryTrackerRemove (p -> hTracker , p -> ba_pool , ptr , size );
293
299
if (ret != UMF_RESULT_SUCCESS ) {
294
300
// DO NOT return an error here, because the tracking provider
295
301
// cannot change behaviour of the upstream provider.
@@ -299,7 +305,7 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
299
305
300
306
ret = umfMemoryProviderFree (p -> hUpstream , ptr , size );
301
307
if (ret != UMF_RESULT_SUCCESS ) {
302
- if (umfMemoryTrackerAdd (p -> hTracker , p -> pool , ptr , size ) !=
308
+ if (umfMemoryTrackerAdd (p -> hTracker , p -> pool , p -> ba_pool , ptr , size ) !=
303
309
UMF_RESULT_SUCCESS ) {
304
310
// TODO: LOG
305
311
}
@@ -318,6 +324,8 @@ static umf_result_t trackingInitialize(void *params, void **ret) {
318
324
}
319
325
320
326
* provider = * ((umf_tracking_memory_provider_t * )params );
327
+ provider -> ba_pool = umf_ba_create (sizeof (tracker_value_t ));
328
+
321
329
* ret = provider ;
322
330
return UMF_RESULT_SUCCESS ;
323
331
}
@@ -358,12 +366,14 @@ static void check_if_tracker_is_empty(umf_memory_tracker_handle_t hTracker,
358
366
#endif /* NDEBUG */
359
367
360
368
static void trackingFinalize (void * provider ) {
361
- #ifndef NDEBUG
362
369
umf_tracking_memory_provider_t * p =
363
370
(umf_tracking_memory_provider_t * )provider ;
371
+
372
+ #ifndef NDEBUG
364
373
check_if_tracker_is_empty (p -> hTracker , p -> pool );
365
374
#endif /* NDEBUG */
366
375
376
+ umf_ba_destroy (p -> ba_pool );
367
377
free (provider );
368
378
}
369
379
0 commit comments