From b113d0c26d8214b8820a152f5bc20496c564b7d3 Mon Sep 17 00:00:00 2001 From: couriersud Date: Thu, 14 Feb 2019 21:34:30 +0100 Subject: netlist: memory pool now supports aligned storage. (nw) Set USE_MEMPOOL to 1 to try this (max 5% performance increase). For mingw, there is no alignment support. This triggers -Wattribute errors which due to -Werror crash the build. --- src/lib/netlist/plib/palloc.h | 83 +++++++++++++++++++++++-------------------- 1 file changed, 44 insertions(+), 39 deletions(-) (limited to 'src/lib/netlist/plib/palloc.h') diff --git a/src/lib/netlist/plib/palloc.h b/src/lib/netlist/plib/palloc.h index da404be279f..793ad1ce553 100644 --- a/src/lib/netlist/plib/palloc.h +++ b/src/lib/netlist/plib/palloc.h @@ -46,40 +46,37 @@ namespace plib { delete [] ptr; } - template - std::unique_ptr make_unique(Args&&... args) - { - return std::unique_ptr(new T(std::forward(args)...)); - } - - template - std::unique_ptr make_unique_base(Args&&... args) - { - std::unique_ptr ret(new DC(std::forward(args)...)); - return ret; - } - - template + template > class owned_ptr { - private: + public: owned_ptr() : m_ptr(nullptr), m_is_owned(true) { } - public: + + template + friend class owned_ptr; + owned_ptr(SC *p, bool owned) noexcept - : m_ptr(p), m_is_owned(owned) + : m_ptr(p), m_deleter(), m_is_owned(owned) + { } + + owned_ptr(SC *p, bool owned, D deleter) noexcept + : m_ptr(p), m_deleter(deleter), m_is_owned(owned) { } + owned_ptr(const owned_ptr &r) = delete; owned_ptr & operator =(owned_ptr &r) = delete; - template - owned_ptr & operator =(owned_ptr &&r) + template + owned_ptr & operator =(owned_ptr &&r) { if (m_is_owned && (m_ptr != nullptr)) - delete m_ptr; + //delete m_ptr; + m_deleter(m_ptr); m_is_owned = r.m_is_owned; m_ptr = r.m_ptr; + m_deleter = r.m_deleter; r.m_is_owned = false; r.m_ptr = nullptr; return *this; @@ -89,50 +86,43 @@ namespace plib { { m_is_owned = r.m_is_owned; m_ptr = r.m_ptr; + m_deleter = r.m_deleter; r.m_is_owned = false; r.m_ptr = nullptr; } owned_ptr &operator=(owned_ptr &&r) noexcept { + if (m_is_owned && (m_ptr != nullptr)) + //delete m_ptr; + m_deleter(m_ptr); m_is_owned = r.m_is_owned; m_ptr = r.m_ptr; + m_deleter = r.m_deleter; r.m_is_owned = false; r.m_ptr = nullptr; return *this; } - template - owned_ptr(owned_ptr &&r) noexcept + template + owned_ptr(owned_ptr &&r) noexcept { m_ptr = static_cast(r.get()); m_is_owned = r.is_owned(); + m_deleter = r.m_deleter; r.release(); } ~owned_ptr() { if (m_is_owned && (m_ptr != nullptr)) - delete m_ptr; + { + //delete m_ptr; + m_deleter(m_ptr); + } m_is_owned = false; m_ptr = nullptr; } - template - static owned_ptr Create(Args&&... args) - { - owned_ptr a; - auto *x = new DC(std::forward(args)...); - a.m_ptr = static_cast(x); - return std::move(a); - } - - template - static owned_ptr Create(Args&&... args) - { - owned_ptr a; - a.m_ptr = new SC(std::forward(args)...); - return std::move(a); - } SC * release() { SC *tmp = m_ptr; @@ -148,9 +138,24 @@ namespace plib { SC * get() const { return m_ptr; } private: SC *m_ptr; + D m_deleter; bool m_is_owned; }; + + template + std::unique_ptr make_unique(Args&&... args) + { + return std::unique_ptr(new T(std::forward(args)...)); + } + + template + static owned_ptr make_owned(Args&&... args) + { + owned_ptr a(new T(std::forward(args)...), true); + return std::move(a); + } + } // namespace plib #endif /* PALLOC_H_ */ -- cgit v1.2.3-70-g09d2