diff options
author | 2016-05-17 00:49:38 +0200 | |
---|---|---|
committer | 2016-05-21 13:31:17 +0200 | |
commit | fdf63818ded94b364616feb528031dd5423d8282 (patch) | |
tree | 2e4e233d439060b9b6561fa8191dd28c21895ebe /src/lib/netlist/plib/palloc.cpp | |
parent | 9102271ef76bfc552b40e087ba5c3968991d9fe9 (diff) |
All netlist devices now follow new syntax. Removed dead code. All sub
devices are now forced to be initialized in the constructor. Device
setup now completely in constructor. Removed start call. [Couriersud]
Diffstat (limited to 'src/lib/netlist/plib/palloc.cpp')
-rw-r--r-- | src/lib/netlist/plib/palloc.cpp | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/lib/netlist/plib/palloc.cpp b/src/lib/netlist/plib/palloc.cpp index b6d188d159e..efa42964434 100644 --- a/src/lib/netlist/plib/palloc.cpp +++ b/src/lib/netlist/plib/palloc.cpp @@ -54,3 +54,76 @@ void pfree_raw(void *p) _mm_free(p); } #endif + +pmempool::pmempool(int min_alloc, int min_align) +: m_min_alloc(min_alloc), m_min_align(min_align) +{ +} +pmempool::~pmempool() +{ + for (auto & b : m_blocks) + { + if (b.m_num_alloc != 0) + fprintf(stderr, "Found block with dangling allocations\n"); + delete b.data; + } + m_blocks.clear(); +} + +int pmempool::new_block() +{ + block b; + b.data = new char[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; +} + + +void *pmempool::alloc(size_t size) +{ + size_t rs = (size + sizeof(info) + m_min_align - 1) & ~(m_min_align - 1); + for (int 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++; + info *i = (info *) b.cur_ptr; + i->m_block = bn; + void *ret = (void *) (b.cur_ptr + sizeof(info)); + b.cur_ptr += rs; + return ret; + } + } + { + int bn = new_block(); + auto &b = m_blocks[bn]; + b.m_num_alloc = 1; + b.m_free = m_min_alloc - rs; + info *i = (info *) b.cur_ptr; + i->m_block = bn; + void *ret = (void *) (b.cur_ptr + sizeof(info)); + b.cur_ptr += rs; + return ret; + } +} + +void pmempool::free(void *ptr) +{ + char *p = (char *) ptr; + + info *i = (info *) (p - sizeof(info)); + 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--; +} |