summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/plib/pmempool.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/plib/pmempool.h')
-rw-r--r--src/lib/netlist/plib/pmempool.h35
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>