@@ -42,3 +42,117 @@ TEST_F(test, metadataNotAllocatedUsingProvider) {
42
42
[pool = pool.get ()](void *ptr) { umfPoolFree (pool, ptr); });
43
43
}
44
44
}
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
+ INSTANTIATE_TEST_SUITE_P (jemallocPoolTest, umfJemallocPoolParamsTest,
158
+ testing::Values (false , true ));
0 commit comments