@@ -42,3 +42,122 @@ TEST_F(test, metadataNotAllocatedUsingProvider) {
4242 [pool = pool.get ()](void *ptr) { umfPoolFree (pool, ptr); });
4343 }
4444}
45+
46+ using jemallocPoolParams = bool ;
47+ struct umfJemallocPoolParamsTest
48+ : umf_test::test,
49+ ::testing::WithParamInterface<jemallocPoolParams> {
50+
51+ struct validation_params_t {
52+ bool keep_all_memory;
53+ };
54+
55+ struct provider_validator : public umf_test ::provider_ba_global {
56+ using base_provider = umf_test::provider_ba_global;
57+
58+ umf_result_t initialize (validation_params_t *params) {
59+ EXPECT_NE (params, nullptr );
60+ expected_params = params;
61+ return UMF_RESULT_SUCCESS;
62+ }
63+ umf_result_t free (void *ptr, size_t size) {
64+ EXPECT_EQ (expected_params->keep_all_memory , false );
65+ return base_provider::free (ptr, size);
66+ }
67+
68+ validation_params_t *expected_params;
69+ };
70+
71+ static constexpr umf_memory_provider_ops_t VALIDATOR_PROVIDER_OPS =
72+ umf::providerMakeCOps<provider_validator, validation_params_t >();
73+
74+ umfJemallocPoolParamsTest () : expected_params{false }, params(nullptr ) {}
75+ void SetUp () override {
76+ test::SetUp ();
77+ expected_params.keep_all_memory = this ->GetParam ();
78+ umf_result_t ret = umfJemallocPoolParamsCreate (¶ms);
79+ ASSERT_EQ (ret, UMF_RESULT_SUCCESS);
80+ ret = umfJemallocPoolParamsSetKeepAllMemory (
81+ params, expected_params.keep_all_memory );
82+ ASSERT_EQ (ret, UMF_RESULT_SUCCESS);
83+ }
84+
85+ void TearDown () override {
86+ umfJemallocPoolParamsDestroy (params);
87+ test::TearDown ();
88+ }
89+
90+ umf::pool_unique_handle_t makePool () {
91+ umf_memory_provider_handle_t hProvider = nullptr ;
92+ umf_memory_pool_handle_t hPool = nullptr ;
93+
94+ auto ret = umfMemoryProviderCreate (&VALIDATOR_PROVIDER_OPS,
95+ &expected_params, &hProvider);
96+ EXPECT_EQ (ret, UMF_RESULT_SUCCESS);
97+
98+ ret = umfPoolCreate (umfJemallocPoolOps (), hProvider, params,
99+ UMF_POOL_CREATE_FLAG_OWN_PROVIDER, &hPool);
100+ EXPECT_EQ (ret, UMF_RESULT_SUCCESS);
101+
102+ return umf::pool_unique_handle_t (hPool, &umfPoolDestroy);
103+ }
104+
105+ void allocFreeFlow () {
106+ static const size_t ALLOC_SIZE = 128 ;
107+ static const size_t NUM_ALLOCATIONS = 100 ;
108+ std::vector<void *> ptrs;
109+
110+ auto pool = makePool ();
111+ ASSERT_NE (pool, nullptr );
112+
113+ for (size_t i = 0 ; i < NUM_ALLOCATIONS; ++i) {
114+ auto *ptr = umfPoolMalloc (pool.get (), ALLOC_SIZE);
115+ ASSERT_NE (ptr, nullptr );
116+ ptrs.push_back (ptr);
117+ }
118+
119+ for (size_t i = 0 ; i < NUM_ALLOCATIONS; ++i) {
120+ auto ret = umfPoolFree (pool.get (), ptrs[i]);
121+ ASSERT_EQ (ret, UMF_RESULT_SUCCESS);
122+ }
123+
124+ // Now pool can call free during pool destruction
125+ expected_params.keep_all_memory = false ;
126+ }
127+
128+ validation_params_t expected_params;
129+ umf_jemalloc_pool_params_handle_t params;
130+ };
131+
132+ TEST_P (umfJemallocPoolParamsTest, allocFree) { allocFreeFlow (); }
133+
134+ TEST_P (umfJemallocPoolParamsTest, updateParams) {
135+ expected_params.keep_all_memory = !expected_params.keep_all_memory ;
136+ umf_result_t ret = umfJemallocPoolParamsSetKeepAllMemory (
137+ params, expected_params.keep_all_memory );
138+ ASSERT_EQ (ret, UMF_RESULT_SUCCESS);
139+
140+ allocFreeFlow ();
141+ }
142+
143+ TEST_P (umfJemallocPoolParamsTest, invalidParams) {
144+ umf_result_t ret = umfJemallocPoolParamsCreate (nullptr );
145+ ASSERT_EQ (ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
146+
147+ ret = umfJemallocPoolParamsSetKeepAllMemory (nullptr , true );
148+ ASSERT_EQ (ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
149+
150+ ret = umfJemallocPoolParamsSetKeepAllMemory (nullptr , false );
151+ ASSERT_EQ (ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
152+
153+ ret = umfJemallocPoolParamsDestroy (nullptr );
154+ ASSERT_EQ (ret, UMF_RESULT_ERROR_INVALID_ARGUMENT);
155+ }
156+
157+ GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST (umfJemallocPoolParamsTest);
158+
159+ /* TODO: enable this test after the issue #903 is fixed.
160+ (https://github.com/oneapi-src/unified-memory-framework/issues/903)
161+ INSTANTIATE_TEST_SUITE_P(jemallocPoolTest, umfJemallocPoolParamsTest,
162+ testing::Values(false, true));
163+ */
0 commit comments