From 47347fe43ec6be9a2e16a17ffbe800c63baa1f11 Mon Sep 17 00:00:00 2001 From: couriersud Date: Wed, 9 Jan 2019 18:16:17 +0100 Subject: C++ and minor performance optimizations. (nw) --- src/lib/netlist/plib/palloc.cpp | 54 ++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 28 deletions(-) (limited to 'src/lib/netlist/plib/palloc.cpp') 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(b.m_num_alloc)); + fprintf(stderr, "Found block with %d dangling allocations\n", static_cast(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(::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(::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(b.cur_ptr); - i->m_block = bn; - auto ret = reinterpret_cast(b.cur_ptr + mininfosize()); - b.cur_ptr += rs; + b->m_free -= rs; + b->m_num_alloc++; + auto i = reinterpret_cast(b->cur_ptr); + i->m_block = b; + auto ret = reinterpret_cast(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(b.cur_ptr); - i->m_block = bn; - auto ret = reinterpret_cast(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(b->cur_ptr); + i->m_block = b; + auto ret = reinterpret_cast(b->cur_ptr + mininfosize()); + b->cur_ptr += rs; return ret; } } @@ -91,7 +89,7 @@ void mempool::free(void *ptr) auto p = reinterpret_cast(ptr); auto i = reinterpret_cast(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 -- cgit v1.2.3-70-g09d2