63 lines
1.3 KiB
C++
63 lines
1.3 KiB
C++
#include "block-cache/mem_pool.h"
|
|
|
|
#include <sstream>
|
|
#include <stdexcept>
|
|
#include <stdlib.h>
|
|
|
|
using namespace bcache;
|
|
using namespace boost;
|
|
using namespace mempool_detail;
|
|
using namespace std;
|
|
|
|
//----------------------------------------------------------------
|
|
|
|
mempool::mempool(size_t block_size, size_t total_mem, size_t alignment)
|
|
{
|
|
mem_ = alloc_aligned(total_mem, alignment);
|
|
|
|
unsigned nr_blocks = total_mem / block_size;
|
|
for (auto i = 0u; i < nr_blocks; i++)
|
|
free(static_cast<unsigned char *>(mem_) + (block_size * i));
|
|
}
|
|
|
|
mempool::~mempool()
|
|
{
|
|
free_.clear();
|
|
::free(mem_);
|
|
}
|
|
|
|
void *
|
|
mempool::alloc()
|
|
{
|
|
if (free_.empty())
|
|
return nullptr;
|
|
|
|
mempool_detail::alloc_block &b = free_.front();
|
|
free_.pop_front();
|
|
return reinterpret_cast<void *>(&b);
|
|
}
|
|
|
|
void
|
|
mempool::free(void *data)
|
|
{
|
|
mempool_detail::alloc_block *b = reinterpret_cast<mempool_detail::alloc_block *>(data);
|
|
free_.push_front(*b);
|
|
}
|
|
|
|
void *
|
|
mempool::alloc_aligned(size_t len, size_t alignment)
|
|
{
|
|
void *result = NULL;
|
|
int r = posix_memalign(&result, alignment, len);
|
|
if (r) {
|
|
ostringstream out;
|
|
out << "posix_memalign failed: len = " << len << ", alignment = " << alignment << ", r = " << r << "\n";
|
|
throw runtime_error(out.str());
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
|