Skip to content

Commit 9ed6a34

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

File tree

2 files changed

+76
-39
lines changed

2 files changed

+76
-39
lines changed

src/provider/provider_tracking.c

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,17 @@
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->tracker_allocator);
30+
if (value == NULL) {
31+
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
32+
}
33+
3434
value->pool = pool;
3535
value->size = size;
3636

@@ -40,7 +40,7 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
4040
return UMF_RESULT_SUCCESS;
4141
}
4242

43-
free(value);
43+
umf_ba_free(hTracker->tracker_allocator, value);
4444

4545
if (ret == ENOMEM) {
4646
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
@@ -68,7 +68,7 @@ static umf_result_t umfMemoryTrackerRemove(umf_memory_tracker_handle_t hTracker,
6868
return UMF_RESULT_ERROR_UNKNOWN;
6969
}
7070

71-
free(value);
71+
umf_ba_free(hTracker->tracker_allocator, value);
7272

7373
return UMF_RESULT_SUCCESS;
7474
}
@@ -129,15 +129,15 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
129129
(umf_tracking_memory_provider_t *)hProvider;
130130

131131
tracker_value_t *splitValue =
132-
(tracker_value_t *)malloc(sizeof(tracker_value_t));
132+
(tracker_value_t *)umf_ba_alloc(provider->hTracker->tracker_allocator);
133133
if (!splitValue) {
134134
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
135135
}
136136

137137
splitValue->pool = provider->pool;
138138
splitValue->size = firstSize;
139139

140-
int r = util_mutex_lock(provider->hTracker->splitMergeMutex);
140+
int r = util_mutex_lock(&provider->hTracker->splitMergeMutex);
141141
if (r) {
142142
goto err_lock;
143143
}
@@ -185,15 +185,15 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
185185
(void)cret;
186186

187187
// free the original value
188-
free(value);
189-
util_mutex_unlock(provider->hTracker->splitMergeMutex);
188+
umf_ba_free(provider->hTracker->tracker_allocator, value);
189+
util_mutex_unlock(&provider->hTracker->splitMergeMutex);
190190

191191
return UMF_RESULT_SUCCESS;
192192

193193
err:
194-
util_mutex_unlock(provider->hTracker->splitMergeMutex);
194+
util_mutex_unlock(&provider->hTracker->splitMergeMutex);
195195
err_lock:
196-
free(splitValue);
196+
umf_ba_free(provider->hTracker->tracker_allocator, splitValue);
197197
return ret;
198198
}
199199

@@ -204,15 +204,16 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
204204
(umf_tracking_memory_provider_t *)hProvider;
205205

206206
tracker_value_t *mergedValue =
207-
(tracker_value_t *)malloc(sizeof(tracker_value_t));
207+
(tracker_value_t *)umf_ba_alloc(provider->hTracker->tracker_allocator);
208+
208209
if (!mergedValue) {
209210
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
210211
}
211212

212213
mergedValue->pool = provider->pool;
213214
mergedValue->size = totalSize;
214215

215-
int r = util_mutex_lock(provider->hTracker->splitMergeMutex);
216+
int r = util_mutex_lock(&provider->hTracker->splitMergeMutex);
216217
if (r) {
217218
goto err_lock;
218219
}
@@ -260,22 +261,22 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
260261
(void)cret;
261262

262263
// free old value that we just replaced with mergedValue
263-
free(lowValue);
264+
umf_ba_free(provider->hTracker->tracker_allocator, lowValue);
264265

265266
void *erasedhighValue =
266267
critnib_remove(provider->hTracker->map, (uintptr_t)highPtr);
267268
assert(erasedhighValue == highValue);
268269

269-
free(erasedhighValue);
270+
umf_ba_free(provider->hTracker->tracker_allocator, erasedhighValue);
270271

271-
util_mutex_unlock(provider->hTracker->splitMergeMutex);
272+
util_mutex_unlock(&provider->hTracker->splitMergeMutex);
272273

273274
return UMF_RESULT_SUCCESS;
274275

275276
err:
276-
util_mutex_unlock(provider->hTracker->splitMergeMutex);
277+
util_mutex_unlock(&provider->hTracker->splitMergeMutex);
277278
err_lock:
278-
free(mergedValue);
279+
umf_ba_free(provider->hTracker->tracker_allocator, mergedValue);
279280
return ret;
280281
}
281282

@@ -310,9 +311,11 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
310311
}
311312

312313
static umf_result_t trackingInitialize(void *params, void **ret) {
314+
umf_tracking_memory_provider_t *p =
315+
(umf_tracking_memory_provider_t *)params;
313316
umf_tracking_memory_provider_t *provider =
314-
(umf_tracking_memory_provider_t *)malloc(
315-
sizeof(umf_tracking_memory_provider_t));
317+
(umf_tracking_memory_provider_t *)umf_ba_linear_alloc(
318+
p->hTracker->pool_linear, sizeof(umf_tracking_memory_provider_t));
316319
if (!provider) {
317320
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
318321
}
@@ -364,7 +367,10 @@ static void trackingFinalize(void *provider) {
364367
check_if_tracker_is_empty(p->hTracker, p->pool);
365368
#endif /* NDEBUG */
366369

367-
free(provider);
370+
(void)provider; // unused in Release build
371+
// provider was allocated from the linear allocator,
372+
// so it will be freed, when the linear allocator is destroyed
373+
// in umfMemoryTrackerDestroy()
368374
}
369375

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

src/provider/provider_tracking.h

Lines changed: 46 additions & 15 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,62 @@ 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 *tracker_allocator;
3039
critnib *map;
31-
os_mutex_t *splitMergeMutex;
40+
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 *tracker_allocator =
53+
umf_ba_create(sizeof(struct tracker_value_t));
54+
if (!tracker_allocator) {
55+
goto err_destroy_pool_linear;
4756
}
4857

49-
handle->splitMergeMutex = util_mutex_create();
50-
if (!handle->splitMergeMutex) {
51-
critnib_delete(handle->map);
52-
free(handle);
53-
return NULL;
58+
umf_memory_tracker_handle_t handle =
59+
(umf_memory_tracker_handle_t)umf_ba_linear_alloc(
60+
pool_linear, sizeof(struct umf_memory_tracker_t));
61+
if (!handle) {
62+
goto err_destroy_tracker_allocator;
63+
}
64+
65+
handle->pool_linear = pool_linear;
66+
handle->tracker_allocator = tracker_allocator;
67+
68+
void *mutex_ptr = util_mutex_init(&handle->splitMergeMutex);
69+
if (!mutex_ptr) {
70+
goto err_destroy_tracker_allocator;
71+
}
72+
73+
handle->map = critnib_new();
74+
if (!handle->map) {
75+
goto err_destroy_mutex;
5476
}
5577

5678
return handle;
79+
80+
err_destroy_mutex:
81+
util_mutex_destroy_not_free(&handle->splitMergeMutex);
82+
err_destroy_tracker_allocator:
83+
umf_ba_destroy(tracker_allocator);
84+
err_destroy_pool_linear:
85+
umf_ba_linear_destroy(pool_linear);
86+
return NULL;
5787
}
5888

5989
static inline void umfMemoryTrackerDestroy(umf_memory_tracker_handle_t handle) {
@@ -62,8 +92,9 @@ static inline void umfMemoryTrackerDestroy(umf_memory_tracker_handle_t handle) {
6292
}
6393

6494
critnib_delete(handle->map);
65-
util_mutex_destroy(handle->splitMergeMutex);
66-
free(handle);
95+
util_mutex_destroy_not_free(&handle->splitMergeMutex);
96+
umf_ba_destroy(handle->tracker_allocator);
97+
umf_ba_linear_destroy(handle->pool_linear);
6798
}
6899

69100
umf_memory_tracker_handle_t umfMemoryTrackerGet(void);

0 commit comments

Comments
 (0)