diff options
Diffstat (limited to 'src/lib/netlist/plib/pmempool.h')
-rw-r--r-- | src/lib/netlist/plib/pmempool.h | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/src/lib/netlist/plib/pmempool.h b/src/lib/netlist/plib/pmempool.h index f55807c86dc..87c74e14856 100644 --- a/src/lib/netlist/plib/pmempool.h +++ b/src/lib/netlist/plib/pmempool.h @@ -40,12 +40,18 @@ namespace plib { { min_bytes = std::max(mp->m_min_alloc, min_bytes); m_free = min_bytes; - std::size_t alloc_bytes = (min_bytes + mp->m_min_align - 1) & ~(mp->m_min_align - 1); - m_data_allocated = static_cast<char *>(::operator new(alloc_bytes)); + std::size_t alloc_bytes = (min_bytes + mp->m_min_align); // - 1); // & ~(mp->m_min_align - 1); + //m_data_allocated = ::operator new(alloc_bytes); + m_data_allocated = new char[alloc_bytes]; void *r = m_data_allocated; std::align(mp->m_min_align, min_bytes, r, alloc_bytes); m_data = reinterpret_cast<char *>(r); } + ~block() + { + //::operator delete(m_data_allocated); + delete [] m_data_allocated; + } std::size_t m_num_alloc; std::size_t m_free; std::size_t m_cur; @@ -106,7 +112,8 @@ namespace plib { plib::perrlogger("Found {} info blocks\n", sinfo().size()); plib::perrlogger("Found block with {} dangling allocations\n", b->m_num_alloc); } - ::operator delete(b->m_data); + plib::pdelete(b); + //::operator delete(b->m_data); } } @@ -125,8 +132,6 @@ namespace plib { auto *ret = reinterpret_cast<void *>(b->m_data + b->m_cur); auto capacity(rs); ret = std::align(align, size, ret, capacity); - // FIXME: if (ret == nullptr) - // printf("Oh no\n"); sinfo().insert({ ret, info(b, b->m_cur)}); rs -= (capacity - size); b->m_cur += rs; @@ -141,8 +146,6 @@ namespace plib { auto *ret = reinterpret_cast<void *>(b->m_data + b->m_cur); auto capacity(rs); ret = std::align(align, size, ret, capacity); - // FIXME: if (ret == nullptr) - // printf("Oh no\n"); sinfo().insert({ ret, info(b, b->m_cur)}); rs -= (capacity - size); b->m_cur += rs; @@ -162,12 +165,20 @@ namespace plib { plib::terminate("mempool::free - double free was called\n"); else { - //b->m_free = m_min_alloc; - //b->cur_ptr = b->data; + b->m_num_alloc--; + //printf("Freeing in block %p %lu\n", b, b->m_num_alloc); + sinfo().erase(it); + if (b->m_num_alloc == 0) + { + mempool *mp = b->m_mempool; + auto itb = std::find(mp->m_blocks.begin(), mp->m_blocks.end(), b); + if (itb == mp->m_blocks.end()) + plib::terminate("mempool::free - block not found\n"); + + mp->m_blocks.erase(itb); + plib::pdelete(b); + } } - b->m_num_alloc--; - //printf("Freeing in block %p %lu\n", b, b->m_num_alloc); - sinfo().erase(it); } template <typename T> |