@@ -37,20 +37,27 @@ 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
+ 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};
50
57
}
51
58
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 {
54
61
return umfOsMemoryProviderOps ();
55
62
}
56
63
static std::string name () { return " os_provider" ; }
@@ -62,73 +69,60 @@ struct proxy_pool : public pool_interface<Provider> {
62
69
getOps ([[maybe_unused]] ::benchmark::State &state) override {
63
70
return umfProxyPoolOps ();
64
71
}
65
- void *getParams ([[maybe_unused]] ::benchmark::State &state) override {
66
- return nullptr ;
67
- }
72
+
68
73
static std::string name () { return " proxy_pool<" + Provider::name () + " >" ; }
69
74
};
70
75
71
76
#ifdef UMF_POOL_DISJOINT_ENABLED
72
77
template <typename Provider>
73
78
struct 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
+ }
75
83
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);
79
88
if (ret != UMF_RESULT_SUCCESS) {
80
- return ;
89
+ state.SkipWithError (" Failed to create disjoint pool params" );
90
+ return {nullptr , [](void *) {}};
81
91
}
82
92
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
+ });
89
98
90
- ret = umfDisjointPoolParamsSetCapacity (disjoint_memory_pool_params, 4 );
99
+ ret = umfDisjointPoolParamsSetSlabMinSize (raw_params, 4096 );
91
100
if (ret != UMF_RESULT_SUCCESS) {
92
- goto err;
101
+ state.SkipWithError (" Failed to set slab min size" );
102
+ return {nullptr , [](void *) {}};
93
103
}
94
104
95
- ret = umfDisjointPoolParamsSetMinBucketSize (disjoint_memory_pool_params,
96
- 4096 );
105
+ ret = umfDisjointPoolParamsSetCapacity (raw_params, 4 );
97
106
if (ret != UMF_RESULT_SUCCESS) {
98
- goto err;
107
+ state.SkipWithError (" Failed to set capacity" );
108
+ return {nullptr , [](void *) {}};
99
109
}
100
110
101
- ret = umfDisjointPoolParamsSetMaxPoolableSize (
102
- disjoint_memory_pool_params, 4096 * 16 );
103
-
111
+ ret = umfDisjointPoolParamsSetMinBucketSize (raw_params, 4096 );
104
112
if (ret != UMF_RESULT_SUCCESS) {
105
- goto err;
113
+ state.SkipWithError (" Failed to set min bucket size" );
114
+ return {nullptr , [](void *) {}};
106
115
}
107
- return ;
108
- err:
109
116
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 *) {}};
117
121
}
118
- }
119
122
120
- umf_memory_pool_ops_t *
121
- getOps ([[maybe_unused]] ::benchmark::State &state) override {
122
- return umfDisjointPoolOps ();
123
+ return params;
123
124
}
124
- void *getParams ([[maybe_unused]] ::benchmark::State &state) override {
125
125
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
- }
132
126
static std::string name () {
133
127
return " disjoint_pool<" + Provider::name () + " >" ;
134
128
}
@@ -142,9 +136,7 @@ struct jemalloc_pool : public pool_interface<Provider> {
142
136
getOps ([[maybe_unused]] ::benchmark::State &state) override {
143
137
return umfJemallocPoolOps ();
144
138
}
145
- void *getParams ([[maybe_unused]] ::benchmark::State &state) override {
146
- return NULL ;
147
- }
139
+
148
140
static std::string name () {
149
141
return " jemalloc_pool<" + Provider::name () + " >" ;
150
142
}
@@ -158,10 +150,7 @@ struct scalable_pool : public pool_interface<Provider> {
158
150
getOps ([[maybe_unused]] ::benchmark::State &state) override {
159
151
return umfScalablePoolOps ();
160
152
}
161
- virtual void *
162
- getParams ([[maybe_unused]] ::benchmark::State &state) override {
163
- return NULL ;
164
- }
153
+
165
154
static std::string name () {
166
155
return " scalable_pool<" + Provider::name () + " >" ;
167
156
}
0 commit comments