Skip to content

Commit cf2bf0c

Browse files
committed
Use base allocator in memory pool, provider and target
Signed-off-by: Lukasz Dorau <[email protected]>
1 parent 6b910ad commit cf2bf0c

File tree

7 files changed

+66
-18
lines changed

7 files changed

+66
-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/memory_pool_default.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,29 @@ umf_result_t umfPoolCreateInternal(const umf_memory_pool_ops_t *ops,
2323
}
2424

2525
umf_result_t ret = UMF_RESULT_SUCCESS;
26-
umf_memory_pool_handle_t pool = malloc(sizeof(umf_memory_pool_t));
26+
27+
umf_ba_linear_pool_t *pool_linear =
28+
umf_ba_linear_create(0 /* minimum pool size */);
29+
if (!pool_linear) {
30+
return NULL;
31+
}
32+
33+
umf_memory_pool_handle_t pool =
34+
umf_ba_linear_alloc(pool_linear, sizeof(umf_memory_pool_t));
2735
if (!pool) {
2836
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
2937
}
3038

3139
assert(ops->version == UMF_VERSION_CURRENT);
3240

41+
pool->pool_linear = pool_linear;
3342
pool->provider = provider;
3443
pool->own_provider = false;
3544

3645
pool->ops = *ops;
3746
ret = ops->initialize(pool->provider, params, &pool->pool_priv);
3847
if (ret != UMF_RESULT_SUCCESS) {
39-
free(pool);
48+
umf_ba_linear_destroy(pool_linear); // it frees pool
4049
return ret;
4150
}
4251

@@ -52,7 +61,7 @@ void umfPoolDestroy(umf_memory_pool_handle_t hPool) {
5261
umfPoolGetMemoryProvider(hPool, &hProvider);
5362
umfMemoryProviderDestroy(hProvider);
5463
}
55-
free(hPool);
64+
umf_ba_linear_destroy(hPool->pool_linear); // it frees hPool
5665
}
5766

5867
umf_result_t umfFree(void *ptr) {

src/memory_pool_internal.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
extern "C" {
2222
#endif
2323

24+
#include <base_alloc_linear.h>
25+
2426
typedef struct umf_memory_pool_t {
2527
void *pool_priv;
2628
umf_memory_pool_ops_t ops;
@@ -29,6 +31,9 @@ typedef struct umf_memory_pool_t {
2931
umf_memory_provider_handle_t provider;
3032
// Tells whether memory provider is owned by the pool.
3133
bool own_provider;
34+
35+
// linear base allocator used by the pool
36+
umf_ba_linear_pool_t *pool_linear;
3237
} umf_memory_pool_t;
3338

3439
umf_result_t umfPoolCreateInternal(const umf_memory_pool_ops_t *ops,

src/memory_pool_tracking.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,21 @@ umf_result_t umfPoolCreateInternal(const umf_memory_pool_ops_t *ops,
2525
}
2626

2727
umf_result_t ret = UMF_RESULT_SUCCESS;
28-
umf_memory_pool_handle_t pool = malloc(sizeof(umf_memory_pool_t));
28+
29+
umf_ba_linear_pool_t *pool_linear =
30+
umf_ba_linear_create(0 /* minimum pool size */);
31+
if (!pool_linear) {
32+
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
33+
}
34+
35+
umf_memory_pool_handle_t pool =
36+
umf_ba_linear_alloc(pool_linear, sizeof(umf_memory_pool_t));
2937
if (!pool) {
3038
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
3139
}
3240

41+
pool->pool_linear = pool_linear;
42+
3343
assert(ops->version == UMF_VERSION_CURRENT);
3444

3545
// wrap provider with memory tracking provider
@@ -51,7 +61,7 @@ umf_result_t umfPoolCreateInternal(const umf_memory_pool_ops_t *ops,
5161
err_pool_init:
5262
umfMemoryProviderDestroy(pool->provider);
5363
err_provider_create:
54-
free(pool);
64+
umf_ba_linear_destroy(pool_linear); // it frees pool
5565

5666
return ret;
5767
}
@@ -66,7 +76,7 @@ void umfPoolDestroy(umf_memory_pool_handle_t hPool) {
6676
}
6777
// Destroy tracking provider.
6878
umfMemoryProviderDestroy(hPool->provider);
69-
free(hPool);
79+
umf_ba_linear_destroy(hPool->pool_linear); // it frees hPool
7080
}
7181

7282
umf_result_t umfFree(void *ptr) {

src/memory_provider.c

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,22 @@
77
*
88
*/
99

10-
#include "memory_provider_internal.h"
11-
#include "utils_common.h"
12-
13-
#include <umf/memory_provider.h>
14-
1510
#include <assert.h>
1611
#include <stdio.h>
1712
#include <stdlib.h>
1813

14+
#include <umf/memory_provider.h>
15+
16+
#include "memory_provider_internal.h"
17+
#include "utils_common.h"
18+
#include <base_alloc_linear.h>
19+
1920
typedef struct umf_memory_provider_t {
2021
umf_memory_provider_ops_t ops;
2122
void *provider_priv;
23+
24+
// linear base allocator used by the provider
25+
umf_ba_linear_pool_t *pool_linear;
2226
} umf_memory_provider_t;
2327

2428
umf_result_t umfMemoryProviderCreate(const umf_memory_provider_ops_t *ops,
@@ -28,20 +32,27 @@ umf_result_t umfMemoryProviderCreate(const umf_memory_provider_ops_t *ops,
2832
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
2933
}
3034

35+
umf_ba_linear_pool_t *pool_linear =
36+
umf_ba_linear_create(0 /* minimum pool size */);
37+
if (!pool_linear) {
38+
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
39+
}
40+
3141
umf_memory_provider_handle_t provider =
32-
malloc(sizeof(umf_memory_provider_t));
42+
umf_ba_linear_alloc(pool_linear, sizeof(umf_memory_provider_t));
3343
if (!provider) {
3444
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
3545
}
3646

3747
assert(ops->version == UMF_VERSION_CURRENT);
3848

49+
provider->pool_linear = pool_linear;
3950
provider->ops = *ops;
4051

4152
void *provider_priv;
4253
umf_result_t ret = ops->initialize(params, &provider_priv);
4354
if (ret != UMF_RESULT_SUCCESS) {
44-
free(provider);
55+
umf_ba_linear_destroy(pool_linear); // it frees provider
4556
return ret;
4657
}
4758

@@ -54,7 +65,7 @@ umf_result_t umfMemoryProviderCreate(const umf_memory_provider_ops_t *ops,
5465

5566
void umfMemoryProviderDestroy(umf_memory_provider_handle_t hProvider) {
5667
hProvider->ops.finalize(hProvider->provider_priv);
57-
free(hProvider);
68+
umf_ba_linear_destroy(hProvider->pool_linear); // it frees hProvider
5869
}
5970

6071
static void

src/memory_target.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,28 @@ umf_result_t umfMemoryTargetCreate(const umf_memory_target_ops_t *ops,
2020
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
2121
}
2222

23+
umf_ba_linear_pool_t *pool_linear =
24+
umf_ba_linear_create(0 /* minimum pool size */);
25+
if (!pool_linear) {
26+
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
27+
}
28+
2329
umf_memory_target_handle_t target =
24-
(umf_memory_target_t *)malloc(sizeof(umf_memory_target_t));
30+
(umf_memory_target_t *)umf_ba_linear_alloc(pool_linear,
31+
sizeof(umf_memory_target_t));
2532
if (!target) {
2633
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
2734
}
2835

2936
assert(ops->version == UMF_VERSION_CURRENT);
3037

38+
target->pool_linear = pool_linear;
3139
target->ops = ops;
3240

3341
void *target_priv;
3442
umf_result_t ret = ops->initialize(params, &target_priv);
3543
if (ret != UMF_RESULT_SUCCESS) {
36-
free(target);
44+
umf_ba_linear_destroy(pool_linear); // it frees target
3745
return ret;
3846
}
3947

@@ -47,5 +55,5 @@ umf_result_t umfMemoryTargetCreate(const umf_memory_target_ops_t *ops,
4755
void umfMemoryTargetDestroy(umf_memory_target_handle_t memoryTarget) {
4856
assert(memoryTarget);
4957
memoryTarget->ops->finalize(memoryTarget->priv);
50-
free(memoryTarget);
58+
umf_ba_linear_destroy(memoryTarget->pool_linear); // it frees memoryTarget
5159
}

src/memory_target.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,17 @@
1616
extern "C" {
1717
#endif
1818

19+
#include <base_alloc_linear.h>
20+
1921
struct umf_memory_target_ops_t;
2022
typedef struct umf_memory_target_ops_t umf_memory_target_ops_t;
2123

2224
typedef struct umf_memory_target_t {
2325
const umf_memory_target_ops_t *ops;
2426
void *priv;
27+
28+
// linear base allocator used by the target
29+
umf_ba_linear_pool_t *pool_linear;
2530
} umf_memory_target_t;
2631

2732
typedef umf_memory_target_t *umf_memory_target_handle_t;

0 commit comments

Comments
 (0)