summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/plib/palloc.cpp
diff options
context:
space:
mode:
author couriersud <couriersud@gmx.org>2019-01-09 18:16:17 +0100
committer couriersud <couriersud@gmx.org>2019-01-09 18:16:17 +0100
commit47347fe43ec6be9a2e16a17ffbe800c63baa1f11 (patch)
tree43c3263b0bbf20e5746ecc859ca0de3a3b5fff2f /src/lib/netlist/plib/palloc.cpp
parenta368aad4b309d2fa3b6ef7e9c919bd3d78692b72 (diff)
C++ and minor performance optimizations. (nw)
Diffstat (limited to 'src/lib/netlist/plib/palloc.cpp')
-rw-r--r--src/lib/netlist/plib/palloc.cpp54
1 files changed, 26 insertions, 28 deletions
diff --git a/src/lib/netlist/plib/palloc.cpp b/src/lib/netlist/plib/palloc.cpp
index e4d31985b23..fa87c1cf94f 100644
--- a/src/lib/netlist/plib/palloc.cpp
+++ b/src/lib/netlist/plib/palloc.cpp
@@ -25,24 +25,24 @@ mempool::~mempool()
{
for (auto & b : m_blocks)
{
- if (b.m_num_alloc != 0)
+ if (b->m_num_alloc != 0)
{
- fprintf(stderr, "Found block with %d dangling allocations\n", static_cast<int>(b.m_num_alloc));
+ fprintf(stderr, "Found block with %d dangling allocations\n", static_cast<int>(b->m_num_alloc));
}
- ::operator delete(b.data);
+ ::operator delete(b->data);
}
m_blocks.clear();
}
-size_t mempool::new_block()
+mempool::block * mempool::new_block()
{
- block b;
- b.data = static_cast<char *>(::operator new(m_min_alloc));
- b.cur_ptr = b.data;
- b.m_free = m_min_alloc;
- b.m_num_alloc = 0;
+ block *b = new block();
+ b->data = static_cast<char *>(::operator new(m_min_alloc));
+ b->cur_ptr = b->data;
+ b->m_free = m_min_alloc;
+ b->m_num_alloc = 0;
m_blocks.push_back(b);
- return m_blocks.size() - 1;
+ return b;
}
size_t mempool::mininfosize()
@@ -59,29 +59,27 @@ size_t mempool::mininfosize()
void *mempool::alloc(size_t size)
{
size_t rs = (size + mininfosize() + m_min_align - 1) & ~(m_min_align - 1);
- for (size_t bn=0; bn < m_blocks.size(); bn++)
+ for (auto &b : m_blocks)
{
- auto &b = m_blocks[bn];
- if (b.m_free > rs)
+ if (b->m_free > rs)
{
- b.m_free -= rs;
- b.m_num_alloc++;
- auto i = reinterpret_cast<info *>(b.cur_ptr);
- i->m_block = bn;
- auto ret = reinterpret_cast<void *>(b.cur_ptr + mininfosize());
- b.cur_ptr += rs;
+ b->m_free -= rs;
+ b->m_num_alloc++;
+ auto i = reinterpret_cast<info *>(b->cur_ptr);
+ i->m_block = b;
+ auto ret = reinterpret_cast<void *>(b->cur_ptr + mininfosize());
+ b->cur_ptr += rs;
return ret;
}
}
{
- size_t bn = new_block();
- auto &b = m_blocks[bn];
- b.m_num_alloc = 1;
- b.m_free = m_min_alloc - rs;
- auto i = reinterpret_cast<info *>(b.cur_ptr);
- i->m_block = bn;
- auto ret = reinterpret_cast<void *>(b.cur_ptr + mininfosize());
- b.cur_ptr += rs;
+ block *b = new_block();
+ b->m_num_alloc = 1;
+ b->m_free = m_min_alloc - rs;
+ auto i = reinterpret_cast<info *>(b->cur_ptr);
+ i->m_block = b;
+ auto ret = reinterpret_cast<void *>(b->cur_ptr + mininfosize());
+ b->cur_ptr += rs;
return ret;
}
}
@@ -91,7 +89,7 @@ void mempool::free(void *ptr)
auto p = reinterpret_cast<char *>(ptr);
auto i = reinterpret_cast<info *>(p - mininfosize());
- block *b = &m_blocks[i->m_block];
+ block *b = i->m_block;
if (b->m_num_alloc == 0)
fprintf(stderr, "Argh .. double free\n");
else