diff options
author | 2019-03-25 23:13:40 +0100 | |
---|---|---|
committer | 2019-03-25 23:13:40 +0100 | |
commit | b380514764cf857469bae61c11143a19f79a74c5 (patch) | |
tree | 63c8012e262618f08a332da31dd714281aa2c5ed /src/lib/netlist/plib/palloc.cpp | |
parent | c24473ddff715ecec2e258a6eb38960cf8c8e98e (diff) |
Revert "conflict resolution (nw)"
This reverts commit c24473ddff715ecec2e258a6eb38960cf8c8e98e, reversing
changes made to 009cba4fb8102102168ef32870892438327f3705.
Diffstat (limited to 'src/lib/netlist/plib/palloc.cpp')
-rw-r--r-- | src/lib/netlist/plib/palloc.cpp | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/src/lib/netlist/plib/palloc.cpp b/src/lib/netlist/plib/palloc.cpp new file mode 100644 index 00000000000..e4d31985b23 --- /dev/null +++ b/src/lib/netlist/plib/palloc.cpp @@ -0,0 +1,105 @@ +// license:GPL-2.0+ +// copyright-holders:Couriersud +/* + * palloc.c + * + */ + +#include "pconfig.h" +#include "palloc.h" +#include "pfmtlog.h" + +#include <algorithm> + +namespace plib { + +//============================================================ +// Memory pool +//============================================================ + +mempool::mempool(size_t min_alloc, size_t min_align) +: m_min_alloc(min_alloc), m_min_align(min_align) +{ +} +mempool::~mempool() +{ + for (auto & b : m_blocks) + { + if (b.m_num_alloc != 0) + { + fprintf(stderr, "Found block with %d dangling allocations\n", static_cast<int>(b.m_num_alloc)); + } + ::operator delete(b.data); + } + m_blocks.clear(); +} + +size_t 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; + m_blocks.push_back(b); + return m_blocks.size() - 1; +} + +size_t mempool::mininfosize() +{ + size_t sinfo = sizeof(mempool::info); +#ifdef __APPLE__ + size_t ma = 16; +#else + size_t ma = 8; +#endif + return ((std::max(m_min_align, sinfo) + ma - 1) / ma) * ma; +} + +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++) + { + auto &b = m_blocks[bn]; + 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; + 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; + return ret; + } +} + +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]; + if (b->m_num_alloc == 0) + fprintf(stderr, "Argh .. double free\n"); + else + { + //b->m_free = m_min_alloc; + //b->cur_ptr = b->data; + } + b->m_num_alloc--; +} + +} |