plib: mempool refactoring. (nw)

This commit is contained in:
couriersud 2019-04-16 02:15:27 +02:00
parent ced8e963be
commit 3afd712637

View File

@ -119,17 +119,27 @@ namespace plib {
void *allocate(size_t align, size_t size) void *allocate(size_t align, size_t size)
{ {
block *b = nullptr;
if (align < m_min_align) if (align < m_min_align)
align = m_min_align; align = m_min_align;
size_t rs = size + align; size_t rs = size + align;
for (auto &b : m_blocks) for (auto &bs : m_blocks)
{ {
if (b->m_free > rs) if (bs->m_free > rs)
{ {
b = bs;
break;
}
}
if (b == nullptr)
{
b = new_block(rs);
}
b->m_free -= rs; b->m_free -= rs;
b->m_num_alloc++; b->m_num_alloc++;
auto *ret = reinterpret_cast<void *>(b->m_data + b->m_cur); void *ret = reinterpret_cast<void *>(b->m_data + b->m_cur);
auto capacity(rs); auto capacity(rs);
ret = std::align(align, size, ret, capacity); ret = std::align(align, size, ret, capacity);
sinfo().insert({ ret, info(b, b->m_cur)}); sinfo().insert({ ret, info(b, b->m_cur)});
@ -138,20 +148,6 @@ namespace plib {
return ret; return ret;
} }
}
{
block *b = new_block(rs);
b->m_num_alloc = 1;
b->m_free = m_min_alloc - rs;
auto *ret = reinterpret_cast<void *>(b->m_data + b->m_cur);
auto capacity(rs);
ret = std::align(align, size, ret, capacity);
sinfo().insert({ ret, info(b, b->m_cur)});
rs -= (capacity - size);
b->m_cur += rs;
return ret;
}
}
static void deallocate(void *ptr) static void deallocate(void *ptr)
{ {
@ -159,8 +155,7 @@ namespace plib {
auto it = sinfo().find(ptr); auto it = sinfo().find(ptr);
if (it == sinfo().end()) if (it == sinfo().end())
plib::terminate("mempool::free - pointer not found\n"); plib::terminate("mempool::free - pointer not found\n");
info i = it->second; block *b = it->second.m_block;
block *b = i.m_block;
if (b->m_num_alloc == 0) if (b->m_num_alloc == 0)
plib::terminate("mempool::free - double free was called\n"); plib::terminate("mempool::free - double free was called\n");
else else