From cfd8a1f997b3382e7774a5ab60de1d85a7b4acbc Mon Sep 17 00:00:00 2001 From: Asias He Date: Tue, 11 Nov 2014 21:55:05 +0800 Subject: [PATCH] Revert "core: special-case deleter for raw memory" This reverts commit f75d1822cc168222d48225d9a36ab42b589f9e08. --- core/deleter.hh | 38 -------------------------------------- 1 file changed, 38 deletions(-) diff --git a/core/deleter.hh b/core/deleter.hh index b02f9e84b7..7bc49bd5bb 100644 --- a/core/deleter.hh +++ b/core/deleter.hh @@ -6,23 +6,17 @@ #define DELETER_HH_ #include -#include -#include 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(_impl); - return x & 1; - } - void* to_raw_object() const { - auto x = reinterpret_cast(_impl); - return reinterpret_cast(x & ~uintptr_t(1)); - } - impl* from_raw_object(void* object) { - auto x = reinterpret_cast(object); - return reinterpret_cast(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(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_ */