24 #ifndef SEASTAR_MODULE
28 #include <type_traits>
29 #include <seastar/util/modules.hh>
55 struct raw_object_tag {};
59 impl* _impl =
nullptr;
68 deleter(raw_object_tag,
void*
object) noexcept
69 : _impl(from_raw_object(
object)) {}
82 explicit operator bool() const noexcept {
return bool(_impl); }
93 static bool is_raw_object(
impl* i) noexcept {
94 auto x =
reinterpret_cast<uintptr_t
>(i);
97 bool is_raw_object() const noexcept {
98 return is_raw_object(_impl);
100 static void* to_raw_object(
impl* i) noexcept {
101 auto x =
reinterpret_cast<uintptr_t
>(i);
102 return reinterpret_cast<void*
>(x & ~uintptr_t(1));
104 void* to_raw_object() const noexcept {
105 return to_raw_object(_impl);
107 impl* from_raw_object(
void*
object) noexcept {
108 auto x =
reinterpret_cast<uintptr_t
>(object);
109 return reinterpret_cast<impl*
>(x | 1);
114 struct deleter::impl {
124 if (is_raw_object()) {
125 std::free(to_raw_object());
128 if (_impl && --_impl->refs == 0) {
137 new (
this)
deleter(std::move(x));
143 template <
typename Deleter>
144 struct lambda_deleter_impl final : deleter::impl {
146 lambda_deleter_impl(deleter next, Deleter&& del)
147 :
impl(std::move(next)), del(std::move(del)) {}
148 virtual ~lambda_deleter_impl()
override { del(); }
151 template <
typename Object>
152 struct object_deleter_impl final : deleter::impl {
154 object_deleter_impl(deleter next, Object&& obj)
155 :
impl(std::move(next)), obj(std::move(obj)) {}
158 template <
typename Object>
160 object_deleter_impl<Object>* make_object_deleter_impl(deleter next, Object obj) {
161 return new object_deleter_impl<Object>(std::move(next), std::move(obj));
166 SEASTAR_MODULE_EXPORT_BEGIN
174 template <
typename Object>
177 return deleter(
new lambda_deleter_impl<Object>(std::move(next), std::move(o)));
185 template <
typename Object>
188 return make_deleter(
deleter(), std::move(o));
190 SEASTAR_MODULE_EXPORT_END
193 struct free_deleter_impl final : deleter::impl {
195 free_deleter_impl(
void* obj) :
impl(
deleter()), obj(obj) {}
196 free_deleter_impl(
const free_deleter_impl&) =
delete;
197 free_deleter_impl(free_deleter_impl&&) =
delete;
198 virtual ~free_deleter_impl()
override { std::free(obj); }
208 if (is_raw_object()) {
209 _impl =
new free_deleter_impl(to_raw_object());
223 impl* next_impl = _impl;
226 if (next_impl == d._impl) {
229 if (is_raw_object(next_impl)) {
230 next_d->_impl = next_impl =
new free_deleter_impl(to_raw_object(next_impl));
233 if (next_impl->refs != 1) {
234 next_d->_impl = next_impl = make_object_deleter_impl(
deleter(next_impl), std::move(d));
238 next_d = &next_impl->next;
239 next_impl = next_d->_impl;
241 next_d->_impl = d._impl;
245 SEASTAR_MODULE_EXPORT_BEGIN
256 return deleter(deleter::raw_object_tag(), obj);
268 return make_deleter(std::move(next), [obj] ()
mutable { std::free(obj); });
273 template <
typename T>
277 return deleter{make_object_deleter_impl(
deleter(), std::move(obj))};
282 template <
typename T>
286 return deleter{make_object_deleter_impl(std::move(d), std::move(obj))};
288 SEASTAR_MODULE_EXPORT_END
Definition: deleter.hh:51
deleter() noexcept=default
Constructs an empty deleter that does nothing in its destructor.
deleter make_free_deleter(deleter next, void *obj)
Definition: deleter.hh:267
deleter make_object_deleter(T &&obj)
Definition: deleter.hh:276
void append(deleter d)
Definition: deleter.hh:219
deleter make_object_deleter(deleter d, T &&obj)
Definition: deleter.hh:285
deleter make_deleter(Object o)
Definition: deleter.hh:187
~deleter()
Destroys the deleter and carries out the encapsulated action.
Definition: deleter.hh:123
deleter share()
Definition: deleter.hh:204
deleter make_free_deleter(void *obj)
Definition: deleter.hh:252
deleter make_deleter(deleter next, Object o)
Definition: deleter.hh:176
holds the implementation parts of the metrics layer, do not use directly.
Seastar API namespace.
Definition: abort_on_ebadf.hh:26