Skip to content

Commit 995c6bb

Browse files
committed
Use base allocator in the tracking provider
Signed-off-by: Lukasz Dorau <[email protected]>
1 parent 93a17d5 commit 995c6bb

File tree

2 files changed

+28
-18
lines changed

2 files changed

+28
-18
lines changed

cmake/helpers.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ function(add_umf_library)
104104
target_link_libraries(${ARG_NAME} PRIVATE ${ARG_LIBS})
105105
target_include_directories(${ARG_NAME} PRIVATE
106106
${UMF_CMAKE_SOURCE_DIR}/include
107-
${UMF_CMAKE_SOURCE_DIR}/src/common)
107+
${UMF_CMAKE_SOURCE_DIR}/src/base_alloc)
108108
add_umf_target_compile_options(${ARG_NAME})
109109
add_umf_target_link_options(${ARG_NAME})
110110
endfunction()

src/provider/provider_tracking.c

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
*/
99

1010
#include "provider_tracking.h"
11+
#include "base_alloc.h"
1112
#include "critnib.h"
1213
#include "utils_concurrency.h"
1314

@@ -27,10 +28,11 @@ typedef struct tracker_value_t {
2728

2829
static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
2930
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) {
3133
assert(ptr);
3234

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);
3436
value->pool = pool;
3537
value->size = size;
3638

@@ -40,7 +42,7 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
4042
return UMF_RESULT_SUCCESS;
4143
}
4244

43-
free(value);
45+
umf_ba_free(ba_pool, value);
4446

4547
if (ret == ENOMEM) {
4648
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
@@ -52,6 +54,7 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
5254
}
5355

5456
static umf_result_t umfMemoryTrackerRemove(umf_memory_tracker_handle_t hTracker,
57+
umf_ba_pool_t *ba_pool,
5558
const void *ptr, size_t size) {
5659
assert(ptr);
5760

@@ -68,7 +71,7 @@ static umf_result_t umfMemoryTrackerRemove(umf_memory_tracker_handle_t hTracker,
6871
return UMF_RESULT_ERROR_UNKNOWN;
6972
}
7073

71-
free(value);
74+
umf_ba_free(ba_pool, value);
7275

7376
return UMF_RESULT_SUCCESS;
7477
}
@@ -92,6 +95,7 @@ typedef struct umf_tracking_memory_provider_t {
9295
umf_memory_provider_handle_t hUpstream;
9396
umf_memory_tracker_handle_t hTracker;
9497
umf_memory_pool_handle_t pool;
98+
umf_ba_pool_t *ba_pool;
9599
} umf_tracking_memory_provider_t;
96100

97101
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,
111115
return ret;
112116
}
113117

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);
115120
if (ret2 != UMF_RESULT_SUCCESS) {
116121
// DO NOT call umfMemoryProviderFree() here, because the tracking provider
117122
// cannot change behaviour of the upstream provider.
@@ -129,7 +134,7 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
129134
(umf_tracking_memory_provider_t *)hProvider;
130135

131136
tracker_value_t *splitValue =
132-
(tracker_value_t *)malloc(sizeof(tracker_value_t));
137+
(tracker_value_t *)umf_ba_alloc(provider->ba_pool);
133138
if (!splitValue) {
134139
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
135140
}
@@ -168,8 +173,8 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
168173

169174
// We'll have a duplicate entry for the range [highPtr, highValue->size] but this is fine,
170175
// 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);
173178
if (ret != UMF_RESULT_SUCCESS) {
174179
fprintf(stderr, "tracking split: umfMemoryTrackerAdd failed\n");
175180
// 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,
185190
(void)cret;
186191

187192
// free the original value
188-
free(value);
193+
umf_ba_free(provider->ba_pool, value);
189194
util_mutex_unlock(provider->hTracker->splitMergeMutex);
190195

191196
return UMF_RESULT_SUCCESS;
192197

193198
err:
194199
util_mutex_unlock(provider->hTracker->splitMergeMutex);
195200
err_lock:
196-
free(splitValue);
201+
umf_ba_free(provider->ba_pool, splitValue);
197202
return ret;
198203
}
199204

@@ -204,7 +209,8 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
204209
(umf_tracking_memory_provider_t *)hProvider;
205210

206211
tracker_value_t *mergedValue =
207-
(tracker_value_t *)malloc(sizeof(tracker_value_t));
212+
(tracker_value_t *)umf_ba_alloc(provider->ba_pool);
213+
;
208214
if (!mergedValue) {
209215
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
210216
}
@@ -260,13 +266,13 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
260266
(void)cret;
261267

262268
// free old value that we just replaced with mergedValue
263-
free(lowValue);
269+
umf_ba_free(provider->ba_pool, lowValue);
264270

265271
void *erasedhighValue =
266272
critnib_remove(provider->hTracker->map, (uintptr_t)highPtr);
267273
assert(erasedhighValue == highValue);
268274

269-
free(erasedhighValue);
275+
umf_ba_free(provider->ba_pool, erasedhighValue);
270276

271277
util_mutex_unlock(provider->hTracker->splitMergeMutex);
272278

@@ -275,7 +281,7 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
275281
err:
276282
util_mutex_unlock(provider->hTracker->splitMergeMutex);
277283
err_lock:
278-
free(mergedValue);
284+
umf_ba_free(provider->ba_pool, mergedValue);
279285
return ret;
280286
}
281287

@@ -289,7 +295,7 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
289295
// could allocate the memory at address `ptr` before a call to umfMemoryTrackerRemove
290296
// resulting in inconsistent state.
291297
if (ptr) {
292-
ret = umfMemoryTrackerRemove(p->hTracker, ptr, size);
298+
ret = umfMemoryTrackerRemove(p->hTracker, p->ba_pool, ptr, size);
293299
if (ret != UMF_RESULT_SUCCESS) {
294300
// DO NOT return an error here, because the tracking provider
295301
// cannot change behaviour of the upstream provider.
@@ -299,7 +305,7 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
299305

300306
ret = umfMemoryProviderFree(p->hUpstream, ptr, size);
301307
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) !=
303309
UMF_RESULT_SUCCESS) {
304310
// TODO: LOG
305311
}
@@ -318,6 +324,8 @@ static umf_result_t trackingInitialize(void *params, void **ret) {
318324
}
319325

320326
*provider = *((umf_tracking_memory_provider_t *)params);
327+
provider->ba_pool = umf_ba_create(sizeof(tracker_value_t));
328+
321329
*ret = provider;
322330
return UMF_RESULT_SUCCESS;
323331
}
@@ -358,12 +366,14 @@ static void check_if_tracker_is_empty(umf_memory_tracker_handle_t hTracker,
358366
#endif /* NDEBUG */
359367

360368
static void trackingFinalize(void *provider) {
361-
#ifndef NDEBUG
362369
umf_tracking_memory_provider_t *p =
363370
(umf_tracking_memory_provider_t *)provider;
371+
372+
#ifndef NDEBUG
364373
check_if_tracker_is_empty(p->hTracker, p->pool);
365374
#endif /* NDEBUG */
366375

376+
umf_ba_destroy(p->ba_pool);
367377
free(provider);
368378
}
369379

0 commit comments

Comments
 (0)