@@ -37,20 +37,29 @@ struct glibc_malloc : public allocator_interface {
37
37
};
38
38
39
39
struct 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 *) {}};
49
47
}
48
+
49
+ // Use a lambda as the custom deleter
50
+ auto deleter = [](void *p) {
51
+ if (p) {
52
+ auto handle =
53
+ static_cast <umf_os_memory_provider_params_handle_t >(p);
54
+ umfOsMemoryProviderParamsDestroy (handle);
55
+ }
56
+ };
57
+
58
+ return {static_cast <void *>(raw_params), deleter};
50
59
}
51
60
52
- void * getParams () override { return params; }
53
- umf_memory_provider_ops_t * getOps () override {
61
+ umf_memory_provider_ops_t *
62
+ getOps ([[maybe_unused]] ::benchmark::State &state ) override {
54
63
return umfOsMemoryProviderOps ();
55
64
}
56
65
static std::string name () { return " os_provider" ; }
@@ -62,73 +71,66 @@ struct proxy_pool : public pool_interface<Provider> {
62
71
getOps ([[maybe_unused]] ::benchmark::State &state) override {
63
72
return umfProxyPoolOps ();
64
73
}
65
- void *getParams ([[maybe_unused]] ::benchmark::State &state) override {
66
- return nullptr ;
67
- }
74
+
68
75
static std::string name () { return " proxy_pool<" + Provider::name () + " >" ; }
69
76
};
70
77
71
78
#ifdef UMF_POOL_DISJOINT_ENABLED
72
79
template <typename Provider>
73
80
struct disjoint_pool : public pool_interface <Provider> {
74
- umf_disjoint_pool_params_handle_t disjoint_memory_pool_params;
81
+ umf_memory_pool_ops_t *
82
+ getOps ([[maybe_unused]] ::benchmark::State &state) override {
83
+ return umfDisjointPoolOps ();
84
+ }
75
85
76
- disjoint_pool () {
77
- disjoint_memory_pool_params = NULL ;
78
- auto ret = umfDisjointPoolParamsCreate (&disjoint_memory_pool_params);
86
+ typename pool_interface<Provider>::params_ptr
87
+ getParams (::benchmark::State &state) override {
88
+ umf_disjoint_pool_params_handle_t raw_params = nullptr ;
89
+ auto ret = umfDisjointPoolParamsCreate (&raw_params);
79
90
if (ret != UMF_RESULT_SUCCESS) {
80
- return ;
91
+ state.SkipWithError (" Failed to create disjoint pool params" );
92
+ return {nullptr , [](void *) {}};
81
93
}
82
94
83
- // those function should never fail, so error handling is minimal.
84
- ret = umfDisjointPoolParamsSetSlabMinSize (disjoint_memory_pool_params,
85
- 4096 );
95
+ ret = umfDisjointPoolParamsSetSlabMinSize (raw_params, 4096 );
86
96
if (ret != UMF_RESULT_SUCCESS) {
87
- goto err;
97
+ state.SkipWithError (" Failed to set slab min size" );
98
+ umfDisjointPoolParamsDestroy (raw_params);
99
+ return {nullptr , [](void *) {}};
88
100
}
89
101
90
- ret = umfDisjointPoolParamsSetCapacity (disjoint_memory_pool_params , 4 );
102
+ ret = umfDisjointPoolParamsSetCapacity (raw_params , 4 );
91
103
if (ret != UMF_RESULT_SUCCESS) {
92
- goto err;
104
+ state.SkipWithError (" Failed to set capacity" );
105
+ umfDisjointPoolParamsDestroy (raw_params);
106
+ return {nullptr , [](void *) {}};
93
107
}
94
108
95
- ret = umfDisjointPoolParamsSetMinBucketSize (disjoint_memory_pool_params,
96
- 4096 );
109
+ ret = umfDisjointPoolParamsSetMinBucketSize (raw_params, 4096 );
97
110
if (ret != UMF_RESULT_SUCCESS) {
98
- goto err;
111
+ state.SkipWithError (" Failed to set min bucket size" );
112
+ umfDisjointPoolParamsDestroy (raw_params);
113
+ return {nullptr , [](void *) {}};
99
114
}
100
115
101
- ret = umfDisjointPoolParamsSetMaxPoolableSize (
102
- disjoint_memory_pool_params, 4096 * 16 );
103
-
116
+ ret = umfDisjointPoolParamsSetMaxPoolableSize (raw_params, 4096 * 16 );
104
117
if (ret != UMF_RESULT_SUCCESS) {
105
- goto err;
118
+ state.SkipWithError (" Failed to set max poolable size" );
119
+ umfDisjointPoolParamsDestroy (raw_params);
120
+ return {nullptr , [](void *) {}};
106
121
}
107
- return ;
108
- err:
109
-
110
- umfDisjointPoolParamsDestroy (disjoint_memory_pool_params);
111
- disjoint_memory_pool_params = NULL ;
112
- }
113
122
114
- ~disjoint_pool () {
115
- if (disjoint_memory_pool_params != NULL ) {
116
- umfDisjointPoolParamsDestroy (disjoint_memory_pool_params);
117
- }
118
- }
123
+ // Use a lambda as the deleter
124
+ auto deleter = [](void *p) {
125
+ if (p) {
126
+ umfDisjointPoolParamsDestroy (
127
+ static_cast <umf_disjoint_pool_params_handle_t >(p));
128
+ }
129
+ };
119
130
120
- umf_memory_pool_ops_t *
121
- getOps ([[maybe_unused]] ::benchmark::State &state) override {
122
- return umfDisjointPoolOps ();
131
+ return {static_cast <void *>(raw_params), deleter};
123
132
}
124
- void *getParams ([[maybe_unused]] ::benchmark::State &state) override {
125
-
126
- if (disjoint_memory_pool_params == NULL ) {
127
- state.SkipWithError (" Failed to create disjoint pool params" );
128
- }
129
133
130
- return disjoint_memory_pool_params;
131
- }
132
134
static std::string name () {
133
135
return " disjoint_pool<" + Provider::name () + " >" ;
134
136
}
@@ -142,9 +144,7 @@ struct jemalloc_pool : public pool_interface<Provider> {
142
144
getOps ([[maybe_unused]] ::benchmark::State &state) override {
143
145
return umfJemallocPoolOps ();
144
146
}
145
- void *getParams ([[maybe_unused]] ::benchmark::State &state) override {
146
- return NULL ;
147
- }
147
+
148
148
static std::string name () {
149
149
return " jemalloc_pool<" + Provider::name () + " >" ;
150
150
}
@@ -158,10 +158,7 @@ struct scalable_pool : public pool_interface<Provider> {
158
158
getOps ([[maybe_unused]] ::benchmark::State &state) override {
159
159
return umfScalablePoolOps ();
160
160
}
161
- virtual void *
162
- getParams ([[maybe_unused]] ::benchmark::State &state) override {
163
- return NULL ;
164
- }
161
+
165
162
static std::string name () {
166
163
return " scalable_pool<" + Provider::name () + " >" ;
167
164
}
0 commit comments