Skip to content

Commit 480eaa7

Browse files
committed
Use base allocator in the tracking provider
Signed-off-by: Lukasz Dorau <[email protected]>
1 parent 6b910ad commit 480eaa7

File tree

3 files changed

+69
-32
lines changed

3 files changed

+69
-32
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: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,13 @@
2020
#include <stdio.h>
2121
#include <stdlib.h>
2222

23-
typedef struct tracker_value_t {
24-
umf_memory_pool_handle_t pool;
25-
size_t size;
26-
} tracker_value_t;
27-
2823
static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
2924
umf_memory_pool_handle_t pool,
3025
const void *ptr, size_t size) {
3126
assert(ptr);
3227

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);
3430
value->pool = pool;
3531
value->size = size;
3632

@@ -40,7 +36,7 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
4036
return UMF_RESULT_SUCCESS;
4137
}
4238

43-
free(value);
39+
umf_ba_free(hTracker->pool_tracker, value);
4440

4541
if (ret == ENOMEM) {
4642
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
@@ -68,7 +64,7 @@ static umf_result_t umfMemoryTrackerRemove(umf_memory_tracker_handle_t hTracker,
6864
return UMF_RESULT_ERROR_UNKNOWN;
6965
}
7066

71-
free(value);
67+
umf_ba_free(hTracker->pool_tracker, value);
7268

7369
return UMF_RESULT_SUCCESS;
7470
}
@@ -129,7 +125,7 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
129125
(umf_tracking_memory_provider_t *)hProvider;
130126

131127
tracker_value_t *splitValue =
132-
(tracker_value_t *)malloc(sizeof(tracker_value_t));
128+
(tracker_value_t *)umf_ba_alloc(provider->hTracker->pool_tracker);
133129
if (!splitValue) {
134130
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
135131
}
@@ -185,15 +181,15 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
185181
(void)cret;
186182

187183
// free the original value
188-
free(value);
184+
umf_ba_free(provider->hTracker->pool_tracker, value);
189185
util_mutex_unlock(provider->hTracker->splitMergeMutex);
190186

191187
return UMF_RESULT_SUCCESS;
192188

193189
err:
194190
util_mutex_unlock(provider->hTracker->splitMergeMutex);
195191
err_lock:
196-
free(splitValue);
192+
umf_ba_free(provider->hTracker->pool_tracker, splitValue);
197193
return ret;
198194
}
199195

@@ -204,7 +200,8 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
204200
(umf_tracking_memory_provider_t *)hProvider;
205201

206202
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+
208205
if (!mergedValue) {
209206
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
210207
}
@@ -260,13 +257,13 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
260257
(void)cret;
261258

262259
// free old value that we just replaced with mergedValue
263-
free(lowValue);
260+
umf_ba_free(provider->hTracker->pool_tracker, lowValue);
264261

265262
void *erasedhighValue =
266263
critnib_remove(provider->hTracker->map, (uintptr_t)highPtr);
267264
assert(erasedhighValue == highValue);
268265

269-
free(erasedhighValue);
266+
umf_ba_free(provider->hTracker->pool_tracker, erasedhighValue);
270267

271268
util_mutex_unlock(provider->hTracker->splitMergeMutex);
272269

@@ -275,7 +272,7 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
275272
err:
276273
util_mutex_unlock(provider->hTracker->splitMergeMutex);
277274
err_lock:
278-
free(mergedValue);
275+
umf_ba_free(provider->hTracker->pool_tracker, mergedValue);
279276
return ret;
280277
}
281278

@@ -310,9 +307,11 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
310307
}
311308

312309
static umf_result_t trackingInitialize(void *params, void **ret) {
310+
umf_tracking_memory_provider_t *p =
311+
(umf_tracking_memory_provider_t *)params;
313312
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));
316315
if (!provider) {
317316
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
318317
}
@@ -364,7 +363,10 @@ static void trackingFinalize(void *provider) {
364363
check_if_tracker_is_empty(p->hTracker, p->pool);
365364
#endif /* NDEBUG */
366365

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()
368370
}
369371

370372
static void trackingGetLastError(void *provider, const char **msg,

src/provider/provider_tracking.h

Lines changed: 48 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
#include <umf/memory_pool.h>
1818
#include <umf/memory_provider.h>
1919

20+
#include "base_alloc.h"
21+
#include "base_alloc_linear.h"
2022
#include "critnib.h"
2123
#include "utils_concurrency.h"
2224

@@ -26,34 +28,66 @@ extern "C" {
2628

2729
extern umf_memory_provider_ops_t UMF_TRACKING_MEMORY_PROVIDER_OPS;
2830

31+
typedef struct tracker_value_t {
32+
umf_memory_pool_handle_t pool;
33+
size_t size;
34+
} tracker_value_t;
35+
2936
struct umf_memory_tracker_t {
37+
umf_ba_linear_pool_t *pool_linear;
38+
umf_ba_pool_t *pool_tracker;
3039
critnib *map;
3140
os_mutex_t *splitMergeMutex;
3241
};
3342

3443
typedef struct umf_memory_tracker_t *umf_memory_tracker_handle_t;
3544

3645
static inline umf_memory_tracker_handle_t umfMemoryTrackerCreate(void) {
37-
umf_memory_tracker_handle_t handle = (umf_memory_tracker_handle_t)malloc(
38-
sizeof(struct umf_memory_tracker_t));
39-
if (!handle) {
46+
umf_ba_linear_pool_t *pool_linear =
47+
umf_ba_linear_create(0 /* minimum pool size */);
48+
if (!pool_linear) {
4049
return NULL;
4150
}
4251

43-
handle->map = critnib_new();
44-
if (!handle->map) {
45-
free(handle);
46-
return NULL;
52+
umf_ba_pool_t *pool_tracker = umf_ba_create(sizeof(struct tracker_value_t));
53+
if (!pool_tracker) {
54+
goto err_destroy_pool_linear;
4755
}
4856

49-
handle->splitMergeMutex = util_mutex_create();
57+
umf_memory_tracker_handle_t handle =
58+
(umf_memory_tracker_handle_t)umf_ba_linear_alloc(
59+
pool_linear, sizeof(struct umf_memory_tracker_t));
60+
if (!handle) {
61+
goto err_destroy_pool_tracker;
62+
}
63+
64+
handle->pool_linear = pool_linear;
65+
handle->pool_tracker = pool_tracker;
66+
67+
void *mutex_ptr = umf_ba_linear_alloc(pool_linear, util_mutex_get_size());
68+
if (!mutex_ptr) {
69+
goto err_destroy_pool_tracker;
70+
}
71+
72+
handle->splitMergeMutex = util_mutex_init(mutex_ptr);
5073
if (!handle->splitMergeMutex) {
51-
critnib_delete(handle->map);
52-
free(handle);
53-
return NULL;
74+
goto err_destroy_pool_tracker;
75+
}
76+
77+
handle->map = critnib_new();
78+
if (!handle->map) {
79+
goto err_destroy_mutex;
5480
}
5581

5682
return handle;
83+
84+
err_destroy_mutex:
85+
util_mutex_destroy_not_free(handle->splitMergeMutex);
86+
err_destroy_pool_tracker:
87+
umf_ba_destroy(pool_tracker);
88+
err_destroy_pool_linear:
89+
umf_ba_linear_destroy(pool_linear);
90+
return NULL;
5791
}
5892

5993
static inline void umfMemoryTrackerDestroy(umf_memory_tracker_handle_t handle) {
@@ -62,8 +96,9 @@ static inline void umfMemoryTrackerDestroy(umf_memory_tracker_handle_t handle) {
6296
}
6397

6498
critnib_delete(handle->map);
65-
util_mutex_destroy(handle->splitMergeMutex);
66-
free(handle);
99+
util_mutex_destroy_not_free(handle->splitMergeMutex);
100+
umf_ba_destroy(handle->pool_tracker);
101+
umf_ba_linear_destroy(handle->pool_linear);
67102
}
68103

69104
umf_memory_tracker_handle_t umfMemoryTrackerGet(void);

0 commit comments

Comments
 (0)