mirror of
https://github.com/scylladb/scylladb.git
synced 2026-04-22 17:40:34 +00:00
Revert "core: special-case deleter for raw memory"
This reverts commit f75d1822cc.
This commit is contained in:
@@ -6,23 +6,17 @@
|
||||
#define DELETER_HH_
|
||||
|
||||
#include <memory>
|
||||
#include <cstdlib>
|
||||
#include <type_traits>
|
||||
|
||||
class deleter {
|
||||
public:
|
||||
struct impl;
|
||||
struct raw_object_tag {};
|
||||
private:
|
||||
// if bit 0 set, point to object to be freed directly.
|
||||
impl* _impl = nullptr;
|
||||
public:
|
||||
deleter() = default;
|
||||
deleter(const deleter&) = delete;
|
||||
deleter(deleter&& x) : _impl(x._impl) { x._impl = nullptr; }
|
||||
explicit deleter(impl* i) : _impl(i) {}
|
||||
deleter(raw_object_tag tag, void* object)
|
||||
: _impl(from_raw_object(object)) {}
|
||||
~deleter();
|
||||
deleter& operator=(deleter&& x);
|
||||
deleter& operator=(deleter&) = delete;
|
||||
@@ -36,19 +30,6 @@ public:
|
||||
this->~deleter();
|
||||
new (this) deleter(i);
|
||||
}
|
||||
private:
|
||||
bool is_raw_object() const {
|
||||
auto x = reinterpret_cast<uintptr_t>(_impl);
|
||||
return x & 1;
|
||||
}
|
||||
void* to_raw_object() const {
|
||||
auto x = reinterpret_cast<uintptr_t>(_impl);
|
||||
return reinterpret_cast<void*>(x & ~uintptr_t(1));
|
||||
}
|
||||
impl* from_raw_object(void* object) {
|
||||
auto x = reinterpret_cast<uintptr_t>(object);
|
||||
return reinterpret_cast<impl*>(x | 1);
|
||||
}
|
||||
};
|
||||
|
||||
struct deleter::impl {
|
||||
@@ -60,10 +41,6 @@ struct deleter::impl {
|
||||
|
||||
inline
|
||||
deleter::~deleter() {
|
||||
if (is_raw_object()) {
|
||||
std::free(to_raw_object());
|
||||
return;
|
||||
}
|
||||
if (_impl && --_impl->refs == 0) {
|
||||
delete _impl;
|
||||
}
|
||||
@@ -92,29 +69,14 @@ make_deleter(deleter next, Deleter d) {
|
||||
return deleter(new lambda_deleter_impl<Deleter>(std::move(next), std::move(d)));
|
||||
}
|
||||
|
||||
struct free_deleter_impl final : deleter::impl {
|
||||
void* obj;
|
||||
free_deleter_impl(void* obj) : impl(deleter()), obj(obj) {}
|
||||
virtual ~free_deleter_impl() override { std::free(obj); }
|
||||
};
|
||||
|
||||
inline
|
||||
deleter
|
||||
deleter::share() {
|
||||
if (!_impl) {
|
||||
return deleter();
|
||||
}
|
||||
if (is_raw_object()) {
|
||||
_impl = new free_deleter_impl(to_raw_object());
|
||||
}
|
||||
++_impl->refs;
|
||||
return deleter(_impl);
|
||||
}
|
||||
|
||||
inline
|
||||
deleter
|
||||
make_free_deleter(void* obj) {
|
||||
return deleter(deleter::raw_object_tag(), obj);
|
||||
}
|
||||
|
||||
#endif /* DELETER_HH_ */
|
||||
|
||||
Reference in New Issue
Block a user