Skip to content

Commit 98b0170

Browse files
Merge pull request #1409 from KFilipek/create_with_null
Allow to create a pool with NULL params
2 parents 4cbc366 + 2e22aa4 commit 98b0170

File tree

6 files changed

+87
-22
lines changed

6 files changed

+87
-22
lines changed

include/umf/memory_pool.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ typedef uint32_t umf_pool_create_flags_t;
4747
/// @brief Creates new memory pool.
4848
/// @param ops instance of umf_memory_pool_ops_t
4949
/// @param provider memory provider that will be used for coarse-grain allocations.
50-
/// @param params pointer to pool-specific parameters
50+
/// @param params pointer to pool-specific parameters, or NULL for defaults
5151
/// @param flags a combination of umf_pool_create_flag_t
5252
/// @param hPool [out] handle to the newly created memory pool
5353
/// @return UMF_RESULT_SUCCESS on success or appropriate error code on failure.

include/umf/memory_pool_ops.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ typedef struct umf_memory_pool_ops_t {
3737
/// @param providers array of memory providers that will be used for coarse-grain allocations.
3838
/// Should contain at least one memory provider.
3939
/// @param numProvider number of elements in the providers array
40-
/// @param params pool-specific params
40+
/// @param params pool-specific params, or NULL for defaults
4141
/// @param pool [out] returns pointer to the pool
4242
/// @return UMF_RESULT_SUCCESS on success or appropriate error code on failure.
4343
///

src/pool/pool_disjoint.c

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -644,20 +644,29 @@ static void free_slab(void *unused, void *slab) {
644644
}
645645
}
646646

647+
static const umf_disjoint_pool_params_t default_params = {
648+
.slab_min_size = 64 * 1024, // 64KB default
649+
.max_poolable_size = 2 * 1024 * 1024, // 2MB default
650+
.capacity = 4, // default
651+
.min_bucket_size = 8, // default
652+
.cur_pool_size = 0,
653+
.pool_trace = 0,
654+
.shared_limits = NULL,
655+
.name = "disjoint"};
656+
647657
umf_result_t disjoint_pool_initialize(umf_memory_provider_handle_t provider,
648658
const void *params, void **ppPool) {
649-
// TODO set defaults when user pass the NULL as params
650-
if (!provider || !params || !ppPool) {
659+
if (!provider || !ppPool) {
651660
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
652661
}
653662

654-
const umf_disjoint_pool_params_t *dp_params = params;
663+
const umf_disjoint_pool_params_t *dp_params;
655664

656-
// min_bucket_size parameter must be a power of 2 for bucket sizes
657-
// to generate correctly.
658-
if (!dp_params->min_bucket_size ||
659-
!IS_POWER_OF_2(dp_params->min_bucket_size)) {
660-
return UMF_RESULT_ERROR_INVALID_ARGUMENT;
665+
// If params is NULL, use default values
666+
if (!params) {
667+
dp_params = &default_params;
668+
} else {
669+
dp_params = params;
661670
}
662671

663672
disjoint_pool_t *disjoint_pool =
@@ -1102,18 +1111,7 @@ umfDisjointPoolParamsCreate(umf_disjoint_pool_params_handle_t *hParams) {
11021111
return UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
11031112
}
11041113

1105-
*params = (umf_disjoint_pool_params_t){
1106-
.slab_min_size = 64 * 1024, // 64K
1107-
.max_poolable_size = 2 * 1024 * 1024, // 2MB
1108-
.capacity = 4,
1109-
.min_bucket_size = UMF_DISJOINT_POOL_MIN_BUCKET_DEFAULT_SIZE,
1110-
.cur_pool_size = 0,
1111-
.pool_trace = 0,
1112-
.shared_limits = NULL,
1113-
};
1114-
1115-
strncpy(params->name, DEFAULT_NAME, sizeof(params->name) - 1);
1116-
params->name[sizeof(params->name) - 1] = '\0';
1114+
*params = default_params;
11171115

11181116
*hParams = params;
11191117
return UMF_RESULT_SUCCESS;

src/pool/pool_scalable.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ static umf_result_t tbb_pool_initialize(umf_memory_provider_handle_t provider,
275275
.keep_all_memory = false,
276276
.reserved = 0};
277277

278+
// If params is provided, override defaults
278279
if (params) {
279280
const umf_scalable_pool_params_t *scalable_params = params;
280281
policy.granularity = scalable_params->granularity;

test/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,11 @@ add_umf_test(
238238
${BA_SOURCES_FOR_TEST}
239239
LIBS ${UMF_UTILS_FOR_TEST})
240240

241+
add_umf_test(
242+
NAME pool_null_params
243+
SRCS test_pool_null_params.cpp
244+
LIBS ${UMF_UTILS_FOR_TEST})
245+
241246
add_umf_test(
242247
NAME c_api_disjoint_pool
243248
SRCS c_api/disjoint_pool.c

test/test_pool_null_params.cpp

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* Copyright (C) 2025 Intel Corporation
3+
*
4+
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
5+
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
*/
7+
8+
#include <gtest/gtest.h>
9+
10+
#include <umf/memory_pool.h>
11+
#include <umf/memory_provider.h>
12+
#include <umf/pools/pool_disjoint.h>
13+
#include <umf/pools/pool_jemalloc.h>
14+
#include <umf/pools/pool_proxy.h>
15+
#include <umf/pools/pool_scalable.h>
16+
17+
#include "provider_null.h"
18+
19+
// Dummy provider implementation for testing
20+
static umf_memory_provider_ops_t dummy_provider_ops = UMF_NULL_PROVIDER_OPS;
21+
22+
using PoolOpsFn = const umf_memory_pool_ops_t *(*)();
23+
24+
class PoolNullParamsTest : public ::testing::TestWithParam<PoolOpsFn> {
25+
protected:
26+
umf_memory_provider_handle_t provider = NULL;
27+
void SetUp() override {
28+
ASSERT_EQ(umfMemoryProviderCreate(&dummy_provider_ops, NULL, &provider),
29+
UMF_RESULT_SUCCESS);
30+
}
31+
void TearDown() override {
32+
if (provider) {
33+
umfMemoryProviderDestroy(provider);
34+
}
35+
}
36+
};
37+
38+
TEST_P(PoolNullParamsTest, CreateWithNullParams) {
39+
umf_memory_pool_handle_t pool;
40+
PoolOpsFn opsFn = GetParam();
41+
umf_result_t res = umfPoolCreate(opsFn(), provider, NULL, 0, &pool);
42+
ASSERT_EQ(res, UMF_RESULT_SUCCESS);
43+
umfPoolDestroy(pool);
44+
}
45+
46+
namespace {
47+
const PoolOpsFn poolOpsList[] = {
48+
#if defined(UMF_POOL_SCALABLE_ENABLED)
49+
&umfScalablePoolOps,
50+
#endif
51+
#if defined(UMF_POOL_JEMALLOC_ENABLED)
52+
&umfJemallocPoolOps,
53+
#endif
54+
#if defined(UMF_POOL_PROXY_ENABLED)
55+
&umfProxyPoolOps
56+
#endif
57+
&umfDisjointPoolOps};
58+
} // namespace
59+
60+
INSTANTIATE_TEST_SUITE_P(poolNullParamsTest, PoolNullParamsTest,
61+
::testing::ValuesIn(poolOpsList));

0 commit comments

Comments
 (0)