@@ -37,20 +37,27 @@ struct glibc_malloc : public allocator_interface {
3737};
3838
3939struct os_provider : public provider_interface {
40- umf_os_memory_provider_params_handle_t params = NULL ;
41- os_provider () {
42- umfOsMemoryProviderParamsCreate (¶ms);
43- return ;
44- }
45-
46- ~os_provider () {
47- if (params != NULL ) {
48- umfOsMemoryProviderParamsDestroy (params);
40+ provider_interface::params_ptr
41+ getParams (::benchmark::State &state) override {
42+ umf_os_memory_provider_params_handle_t raw_params = nullptr ;
43+ umfOsMemoryProviderParamsCreate (&raw_params);
44+ if (!raw_params) {
45+ state.SkipWithError (" Failed to create os provider params" );
46+ return {nullptr , [](void *) {}};
4947 }
48+
49+ // Use a lambda as the custom deleter
50+ auto deleter = [](void *p) {
51+ auto handle =
52+ static_cast <umf_os_memory_provider_params_handle_t >(p);
53+ umfOsMemoryProviderParamsDestroy (handle);
54+ };
55+
56+ return {static_cast <void *>(raw_params), deleter};
5057 }
5158
52- void * getParams () override { return params; }
53- umf_memory_provider_ops_t * getOps () override {
59+ umf_memory_provider_ops_t *
60+ getOps ([[maybe_unused]] ::benchmark::State &state ) override {
5461 return umfOsMemoryProviderOps ();
5562 }
5663 static std::string name () { return " os_provider" ; }
@@ -62,73 +69,60 @@ struct proxy_pool : public pool_interface<Provider> {
6269 getOps ([[maybe_unused]] ::benchmark::State &state) override {
6370 return umfProxyPoolOps ();
6471 }
65- void *getParams ([[maybe_unused]] ::benchmark::State &state) override {
66- return nullptr ;
67- }
72+
6873 static std::string name () { return " proxy_pool<" + Provider::name () + " >" ; }
6974};
7075
7176#ifdef UMF_POOL_DISJOINT_ENABLED
7277template <typename Provider>
7378struct disjoint_pool : public pool_interface <Provider> {
74- umf_disjoint_pool_params_handle_t disjoint_memory_pool_params;
79+ umf_memory_pool_ops_t *
80+ getOps ([[maybe_unused]] ::benchmark::State &state) override {
81+ return umfDisjointPoolOps ();
82+ }
7583
76- disjoint_pool () {
77- disjoint_memory_pool_params = NULL ;
78- auto ret = umfDisjointPoolParamsCreate (&disjoint_memory_pool_params);
84+ typename pool_interface<Provider>::params_ptr
85+ getParams (::benchmark::State &state) override {
86+ umf_disjoint_pool_params_handle_t raw_params = nullptr ;
87+ auto ret = umfDisjointPoolParamsCreate (&raw_params);
7988 if (ret != UMF_RESULT_SUCCESS) {
80- return ;
89+ state.SkipWithError (" Failed to create disjoint pool params" );
90+ return {nullptr , [](void *) {}};
8191 }
8292
83- // those function should never fail, so error handling is minimal.
84- ret = umfDisjointPoolParamsSetSlabMinSize (disjoint_memory_pool_params,
85- 4096 );
86- if (ret != UMF_RESULT_SUCCESS) {
87- goto err;
88- }
93+ typename pool_interface<Provider>::params_ptr params (
94+ raw_params, [](void *p) {
95+ umfDisjointPoolParamsDestroy (
96+ static_cast <umf_disjoint_pool_params_handle_t >(p));
97+ });
8998
90- ret = umfDisjointPoolParamsSetCapacity (disjoint_memory_pool_params, 4 );
99+ ret = umfDisjointPoolParamsSetSlabMinSize (raw_params, 4096 );
91100 if (ret != UMF_RESULT_SUCCESS) {
92- goto err;
101+ state.SkipWithError (" Failed to set slab min size" );
102+ return {nullptr , [](void *) {}};
93103 }
94104
95- ret = umfDisjointPoolParamsSetMinBucketSize (disjoint_memory_pool_params,
96- 4096 );
105+ ret = umfDisjointPoolParamsSetCapacity (raw_params, 4 );
97106 if (ret != UMF_RESULT_SUCCESS) {
98- goto err;
107+ state.SkipWithError (" Failed to set capacity" );
108+ return {nullptr , [](void *) {}};
99109 }
100110
101- ret = umfDisjointPoolParamsSetMaxPoolableSize (
102- disjoint_memory_pool_params, 4096 * 16 );
103-
111+ ret = umfDisjointPoolParamsSetMinBucketSize (raw_params, 4096 );
104112 if (ret != UMF_RESULT_SUCCESS) {
105- goto err;
113+ state.SkipWithError (" Failed to set min bucket size" );
114+ return {nullptr , [](void *) {}};
106115 }
107- return ;
108- err:
109116
110- umfDisjointPoolParamsDestroy (disjoint_memory_pool_params);
111- disjoint_memory_pool_params = NULL ;
112- }
113-
114- ~disjoint_pool () {
115- if (disjoint_memory_pool_params != NULL ) {
116- umfDisjointPoolParamsDestroy (disjoint_memory_pool_params);
117+ ret = umfDisjointPoolParamsSetMaxPoolableSize (raw_params, 4096 * 16 );
118+ if (ret != UMF_RESULT_SUCCESS) {
119+ state.SkipWithError (" Failed to set max poolable size" );
120+ return {nullptr , [](void *) {}};
117121 }
118- }
119122
120- umf_memory_pool_ops_t *
121- getOps ([[maybe_unused]] ::benchmark::State &state) override {
122- return umfDisjointPoolOps ();
123+ return params;
123124 }
124- void *getParams ([[maybe_unused]] ::benchmark::State &state) override {
125125
126- if (disjoint_memory_pool_params == NULL ) {
127- state.SkipWithError (" Failed to create disjoint pool params" );
128- }
129-
130- return disjoint_memory_pool_params;
131- }
132126 static std::string name () {
133127 return " disjoint_pool<" + Provider::name () + " >" ;
134128 }
@@ -142,9 +136,7 @@ struct jemalloc_pool : public pool_interface<Provider> {
142136 getOps ([[maybe_unused]] ::benchmark::State &state) override {
143137 return umfJemallocPoolOps ();
144138 }
145- void *getParams ([[maybe_unused]] ::benchmark::State &state) override {
146- return NULL ;
147- }
139+
148140 static std::string name () {
149141 return " jemalloc_pool<" + Provider::name () + " >" ;
150142 }
@@ -158,10 +150,7 @@ struct scalable_pool : public pool_interface<Provider> {
158150 getOps ([[maybe_unused]] ::benchmark::State &state) override {
159151 return umfScalablePoolOps ();
160152 }
161- virtual void *
162- getParams ([[maybe_unused]] ::benchmark::State &state) override {
163- return NULL ;
164- }
153+
165154 static std::string name () {
166155 return " scalable_pool<" + Provider::name () + " >" ;
167156 }
0 commit comments