Skip to content

Commit aff94a2

Browse files
authored
Merge pull request #170 from ldorau/Use_base_allocator_in_the_tracking_provider
Use base allocator in the tracking provider
2 parents efd6071 + faa65ee commit aff94a2

File tree

5 files changed

+71
-53
lines changed

5 files changed

+71
-53
lines changed

src/provider/provider_tracking.c

Lines changed: 66 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,12 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
3030
const void *ptr, size_t size) {
3131
assert(ptr);
3232

33-
tracker_value_t *value = (tracker_value_t *)malloc(sizeof(tracker_value_t));
33+
tracker_value_t *value =
34+
(tracker_value_t *)umf_ba_alloc(hTracker->tracker_allocator);
35+
if (value == NULL) {
36+
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
37+
}
38+
3439
value->pool = pool;
3540
value->size = size;
3641

@@ -40,7 +45,7 @@ static umf_result_t umfMemoryTrackerAdd(umf_memory_tracker_handle_t hTracker,
4045
return UMF_RESULT_SUCCESS;
4146
}
4247

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

4550
if (ret == ENOMEM) {
4651
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
@@ -68,7 +73,7 @@ static umf_result_t umfMemoryTrackerRemove(umf_memory_tracker_handle_t hTracker,
6873
return UMF_RESULT_ERROR_UNKNOWN;
6974
}
7075

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

7378
return UMF_RESULT_SUCCESS;
7479
}
@@ -128,15 +133,15 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
128133
(umf_tracking_memory_provider_t *)hProvider;
129134

130135
tracker_value_t *splitValue =
131-
(tracker_value_t *)malloc(sizeof(tracker_value_t));
136+
(tracker_value_t *)umf_ba_alloc(provider->hTracker->tracker_allocator);
132137
if (!splitValue) {
133138
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
134139
}
135140

136141
splitValue->pool = provider->pool;
137142
splitValue->size = firstSize;
138143

139-
int r = util_mutex_lock(provider->hTracker->splitMergeMutex);
144+
int r = util_mutex_lock(&provider->hTracker->splitMergeMutex);
140145
if (r) {
141146
goto err_lock;
142147
}
@@ -184,15 +189,15 @@ static umf_result_t trackingAllocationSplit(void *hProvider, void *ptr,
184189
(void)cret;
185190

186191
// free the original value
187-
free(value);
188-
util_mutex_unlock(provider->hTracker->splitMergeMutex);
192+
umf_ba_free(provider->hTracker->tracker_allocator, value);
193+
util_mutex_unlock(&provider->hTracker->splitMergeMutex);
189194

190195
return UMF_RESULT_SUCCESS;
191196

192197
err:
193-
util_mutex_unlock(provider->hTracker->splitMergeMutex);
198+
util_mutex_unlock(&provider->hTracker->splitMergeMutex);
194199
err_lock:
195-
free(splitValue);
200+
umf_ba_free(provider->hTracker->tracker_allocator, splitValue);
196201
return ret;
197202
}
198203

@@ -203,15 +208,16 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
203208
(umf_tracking_memory_provider_t *)hProvider;
204209

205210
tracker_value_t *mergedValue =
206-
(tracker_value_t *)malloc(sizeof(tracker_value_t));
211+
(tracker_value_t *)umf_ba_alloc(provider->hTracker->tracker_allocator);
212+
207213
if (!mergedValue) {
208214
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
209215
}
210216

211217
mergedValue->pool = provider->pool;
212218
mergedValue->size = totalSize;
213219

214-
int r = util_mutex_lock(provider->hTracker->splitMergeMutex);
220+
int r = util_mutex_lock(&provider->hTracker->splitMergeMutex);
215221
if (r) {
216222
goto err_lock;
217223
}
@@ -259,22 +265,22 @@ static umf_result_t trackingAllocationMerge(void *hProvider, void *lowPtr,
259265
(void)cret;
260266

261267
// free old value that we just replaced with mergedValue
262-
free(lowValue);
268+
umf_ba_free(provider->hTracker->tracker_allocator, lowValue);
263269

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

268-
free(erasedhighValue);
274+
umf_ba_free(provider->hTracker->tracker_allocator, erasedhighValue);
269275

270-
util_mutex_unlock(provider->hTracker->splitMergeMutex);
276+
util_mutex_unlock(&provider->hTracker->splitMergeMutex);
271277

272278
return UMF_RESULT_SUCCESS;
273279

274280
err:
275-
util_mutex_unlock(provider->hTracker->splitMergeMutex);
281+
util_mutex_unlock(&provider->hTracker->splitMergeMutex);
276282
err_lock:
277-
free(mergedValue);
283+
umf_ba_free(provider->hTracker->tracker_allocator, mergedValue);
278284
return ret;
279285
}
280286

@@ -309,9 +315,11 @@ static umf_result_t trackingFree(void *hProvider, void *ptr, size_t size) {
309315
}
310316

311317
static umf_result_t trackingInitialize(void *params, void **ret) {
318+
umf_tracking_memory_provider_t *p =
319+
(umf_tracking_memory_provider_t *)params;
312320
umf_tracking_memory_provider_t *provider =
313-
(umf_tracking_memory_provider_t *)malloc(
314-
sizeof(umf_tracking_memory_provider_t));
321+
(umf_tracking_memory_provider_t *)umf_ba_linear_alloc(
322+
p->hTracker->pool_linear, sizeof(umf_tracking_memory_provider_t));
315323
if (!provider) {
316324
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
317325
}
@@ -363,7 +371,10 @@ static void trackingFinalize(void *provider) {
363371
check_if_tracker_is_empty(p->hTracker, p->pool);
364372
#endif /* NDEBUG */
365373

366-
free(provider);
374+
(void)provider; // unused in Release build
375+
// provider was allocated from the linear allocator,
376+
// so it will be freed, when the linear allocator is destroyed
377+
// in umfMemoryTrackerDestroy()
367378
}
368379

369380
static void trackingGetLastError(void *provider, const char **msg,
@@ -447,26 +458,47 @@ void umfTrackingMemoryProviderGetUpstreamProvider(
447458
}
448459

449460
umf_memory_tracker_handle_t umfMemoryTrackerCreate(void) {
450-
umf_memory_tracker_handle_t handle = (umf_memory_tracker_handle_t)malloc(
451-
sizeof(struct umf_memory_tracker_t));
452-
if (!handle) {
461+
umf_ba_linear_pool_t *pool_linear =
462+
umf_ba_linear_create(0 /* minimum pool size */);
463+
if (!pool_linear) {
453464
return NULL;
454465
}
455466

456-
handle->map = critnib_new();
457-
if (!handle->map) {
458-
free(handle);
459-
return NULL;
467+
umf_ba_pool_t *tracker_allocator =
468+
umf_ba_create(sizeof(struct tracker_value_t));
469+
if (!tracker_allocator) {
470+
goto err_destroy_pool_linear;
460471
}
461472

462-
handle->splitMergeMutex = util_mutex_create();
463-
if (!handle->splitMergeMutex) {
464-
critnib_delete(handle->map);
465-
free(handle);
466-
return NULL;
473+
umf_memory_tracker_handle_t handle =
474+
(umf_memory_tracker_handle_t)umf_ba_linear_alloc(
475+
pool_linear, sizeof(struct umf_memory_tracker_t));
476+
if (!handle) {
477+
goto err_destroy_tracker_allocator;
478+
}
479+
480+
handle->pool_linear = pool_linear;
481+
handle->tracker_allocator = tracker_allocator;
482+
483+
void *mutex_ptr = util_mutex_init(&handle->splitMergeMutex);
484+
if (!mutex_ptr) {
485+
goto err_destroy_tracker_allocator;
486+
}
487+
488+
handle->map = critnib_new();
489+
if (!handle->map) {
490+
goto err_destroy_mutex;
467491
}
468492

469493
return handle;
494+
495+
err_destroy_mutex:
496+
util_mutex_destroy_not_free(&handle->splitMergeMutex);
497+
err_destroy_tracker_allocator:
498+
umf_ba_destroy(tracker_allocator);
499+
err_destroy_pool_linear:
500+
umf_ba_linear_destroy(pool_linear);
501+
return NULL;
470502
}
471503

472504
void umfMemoryTrackerDestroy(umf_memory_tracker_handle_t handle) {
@@ -479,6 +511,7 @@ void umfMemoryTrackerDestroy(umf_memory_tracker_handle_t handle) {
479511
#endif /* NDEBUG */
480512

481513
critnib_delete(handle->map);
482-
util_mutex_destroy(handle->splitMergeMutex);
483-
free(handle);
514+
util_mutex_destroy_not_free(&handle->splitMergeMutex);
515+
umf_ba_destroy(handle->tracker_allocator);
516+
umf_ba_linear_destroy(handle->pool_linear);
484517
}

src/provider/provider_tracking.h

Lines changed: 5 additions & 1 deletion
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

@@ -25,8 +27,10 @@ extern "C" {
2527
#endif
2628

2729
struct umf_memory_tracker_t {
30+
umf_ba_linear_pool_t *pool_linear;
31+
umf_ba_pool_t *tracker_allocator;
2832
critnib *map;
29-
os_mutex_t *splitMergeMutex;
33+
os_mutex_t splitMergeMutex;
3034
};
3135

3236
typedef struct umf_memory_tracker_t *umf_memory_tracker_handle_t;

src/utils/utils_concurrency.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,7 @@ typedef struct os_mutex_t {
3232

3333
size_t util_mutex_get_size(void);
3434
os_mutex_t *util_mutex_init(void *ptr);
35-
os_mutex_t *util_mutex_create(void);
3635
void util_mutex_destroy_not_free(os_mutex_t *m);
37-
void util_mutex_destroy(os_mutex_t *mutex);
3836
int util_mutex_lock(os_mutex_t *mutex);
3937
int util_mutex_unlock(os_mutex_t *mutex);
4038

src/utils/utils_posix_concurrency.c

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,12 @@ os_mutex_t *util_mutex_init(void *ptr) {
2020
return ret == 0 ? ((os_mutex_t *)mutex) : NULL;
2121
}
2222

23-
os_mutex_t *util_mutex_create(void) {
24-
return util_mutex_init(malloc(util_mutex_get_size()));
25-
}
26-
2723
void util_mutex_destroy_not_free(os_mutex_t *m) {
2824
pthread_mutex_t *mutex = (pthread_mutex_t *)m;
2925
int ret = pthread_mutex_destroy(mutex);
3026
(void)ret; // TODO: add logging
3127
}
3228

33-
void util_mutex_destroy(os_mutex_t *m) {
34-
util_mutex_destroy_not_free(m);
35-
free(m);
36-
}
37-
3829
int util_mutex_lock(os_mutex_t *m) {
3930
return pthread_mutex_lock((pthread_mutex_t *)m);
4031
}

src/utils/utils_windows_concurrency.c

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,11 @@ os_mutex_t *util_mutex_init(void *ptr) {
1717
return (os_mutex_t *)mutex_internal;
1818
}
1919

20-
os_mutex_t *util_mutex_create(void) {
21-
return util_mutex_init(calloc(1, util_mutex_get_size()));
22-
}
23-
2420
void util_mutex_destroy_not_free(os_mutex_t *mutex) {
2521
os_mutex_t *mutex_internal = (os_mutex_t *)mutex;
2622
DeleteCriticalSection(&mutex_internal->lock);
2723
}
2824

29-
void util_mutex_destroy(os_mutex_t *mutex) {
30-
util_mutex_destroy_not_free(mutex);
31-
}
32-
3325
int util_mutex_lock(os_mutex_t *mutex) {
3426
os_mutex_t *mutex_internal = (os_mutex_t *)mutex;
3527
EnterCriticalSection(&mutex_internal->lock);

0 commit comments

Comments
 (0)