Skip to content

Commit bcbb979

Browse files
committed
Use base allocator in the tracking provider
Signed-off-by: Lukasz Dorau <[email protected]>
1 parent 9f7b62a commit bcbb979

File tree

3 files changed

+63
-30
lines changed

3 files changed

+63
-30
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: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
#include <umf/memory_pool.h>
1717
#include <umf/memory_provider.h>
1818

19+
#include "base_alloc.h"
20+
#include "base_alloc_linear.h"
1921
#include "critnib.h"
2022
#include "utils_concurrency.h"
2123

@@ -25,34 +27,62 @@ extern "C" {
2527

2628
extern umf_memory_provider_ops_t UMF_TRACKING_MEMORY_PROVIDER_OPS;
2729

30+
typedef struct tracker_value_t {
31+
umf_memory_pool_handle_t pool;
32+
size_t size;
33+
} tracker_value_t;
34+
2835
struct umf_memory_tracker_t {
36+
umf_ba_linear_pool_t *pool_linear;
37+
umf_ba_pool_t *pool_tracker;
2938
critnib *map;
3039
os_mutex_t *splitMergeMutex;
3140
};
3241

3342
typedef struct umf_memory_tracker_t *umf_memory_tracker_handle_t;
3443

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

51+
umf_ba_pool_t *pool_tracker = umf_ba_create(sizeof(struct tracker_value_t));
52+
if (!pool_tracker) {
53+
goto err_destroy_pool_linear;
54+
}
55+
56+
umf_memory_tracker_handle_t handle =
57+
(umf_memory_tracker_handle_t)umf_ba_linear_alloc(
58+
pool_linear, sizeof(struct umf_memory_tracker_t));
59+
if (!handle) {
60+
goto err_destroy_pool_tracker;
61+
}
62+
63+
handle->pool_linear = pool_linear;
64+
handle->pool_tracker = pool_tracker;
65+
4266
handle->map = critnib_new();
4367
if (!handle->map) {
44-
free(handle);
45-
return NULL;
68+
goto err_destroy_pool_tracker;
4669
}
4770

48-
handle->splitMergeMutex = util_mutex_create();
71+
handle->splitMergeMutex = util_mutex_init(
72+
umf_ba_linear_alloc(pool_linear, util_mutex_get_size()));
4973
if (!handle->splitMergeMutex) {
50-
critnib_delete(handle->map);
51-
free(handle);
52-
return NULL;
74+
goto err_critnib_delete;
5375
}
5476

5577
return handle;
78+
79+
err_critnib_delete:
80+
critnib_delete(handle->map);
81+
err_destroy_pool_tracker:
82+
umf_ba_destroy(pool_tracker);
83+
err_destroy_pool_linear:
84+
umf_ba_linear_destroy(pool_linear);
85+
return NULL;
5686
}
5787

5888
static inline void umfMemoryTrackerDestroy(umf_memory_tracker_handle_t handle) {
@@ -61,8 +91,9 @@ static inline void umfMemoryTrackerDestroy(umf_memory_tracker_handle_t handle) {
6191
}
6292

6393
critnib_delete(handle->map);
64-
util_mutex_destroy(handle->splitMergeMutex);
65-
free(handle);
94+
util_mutex_destroy_not_free(handle->splitMergeMutex);
95+
umf_ba_destroy(handle->pool_tracker);
96+
umf_ba_linear_destroy(handle->pool_linear);
6697
}
6798

6899
umf_memory_tracker_handle_t umfMemoryTrackerGet(void);

0 commit comments

Comments
 (0)