diff options
author | 2017-02-04 01:23:12 +0100 | |
---|---|---|
committer | 2017-02-05 17:19:53 +0100 | |
commit | 70051f6c1f009bae411d68a8afa229259504e866 (patch) | |
tree | 0c19623b17b546ffe6cba8697aa9ddce687cf00a /src/lib/netlist/plib/palloc.cpp | |
parent | 427cf984dbcab7584f0f75ed6295d97543422a4a (diff) |
Netlist: It is now possible to have multiple handlers per device ...
... for updates. This will make device implementation more flexible and
faster. A nice side-effect is that there was some minor (<5%)
performance increase already. Each input is now assigned a notification
handler. Currently this is update, but going forward this may be a
custom handler. In addition
- fixed MEMPOOL on OSX
- removed dead code
- avoid bit-rot
- added delegate support for emscripten and arm processors
- added delegate support for VS 2015 x64
[Couriersud]
Diffstat (limited to 'src/lib/netlist/plib/palloc.cpp')
-rwxr-xr-x[-rw-r--r--] | src/lib/netlist/plib/palloc.cpp | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/src/lib/netlist/plib/palloc.cpp b/src/lib/netlist/plib/palloc.cpp index ceee5a75904..1377edabde5 100644..100755 --- a/src/lib/netlist/plib/palloc.cpp +++ b/src/lib/netlist/plib/palloc.cpp @@ -5,6 +5,8 @@ * */ +#include <algorithm> + #include "pconfig.h" #include "palloc.h" #include "pfmtlog.h" @@ -27,7 +29,7 @@ mempool::~mempool() { fprintf(stderr, "Found block with %d dangling allocations\n", static_cast<int>(b.m_num_alloc)); } - delete b.data; + ::operator delete(b.data); } m_blocks.clear(); } @@ -35,7 +37,7 @@ mempool::~mempool() size_t mempool::new_block() { block b; - b.data = new char[m_min_alloc]; + 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; @@ -43,10 +45,19 @@ size_t mempool::new_block() return m_blocks.size() - 1; } +size_t mempool::mininfosize() +{ + size_t sinfo = sizeof(mempool::info); + size_t ma = 8; +#ifdef __APPLE__ + ma = 16; +#endif + return ((std::max(m_min_align, sinfo) + ma - 1) / ma) * ma; +} void *mempool::alloc(size_t size) { - size_t rs = (size + sizeof(info) + m_min_align - 1) & ~(m_min_align - 1); + 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]; @@ -56,7 +67,7 @@ void *mempool::alloc(size_t size) b.m_num_alloc++; auto i = reinterpret_cast<info *>(b.cur_ptr); i->m_block = bn; - auto ret = reinterpret_cast<void *>(b.cur_ptr + sizeof(info)); + auto ret = reinterpret_cast<void *>(b.cur_ptr + mininfosize()); b.cur_ptr += rs; return ret; } @@ -68,7 +79,7 @@ void *mempool::alloc(size_t size) 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 + sizeof(info)); + auto ret = reinterpret_cast<void *>(b.cur_ptr + mininfosize()); b.cur_ptr += rs; return ret; } @@ -78,7 +89,7 @@ void mempool::free(void *ptr) { auto p = reinterpret_cast<char *>(ptr); - auto i = reinterpret_cast<info *>(p - sizeof(info)); + 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"); |