2016-04-14 13:24:32 +05:30
|
|
|
#ifndef BLOCK_CACHE_MEM_POOL_H
|
|
|
|
#define BLOCK_CACHE_MEM_POOL_H
|
|
|
|
|
|
|
|
#include <boost/intrusive/list.hpp>
|
|
|
|
#include <boost/optional.hpp>
|
|
|
|
#include <list>
|
|
|
|
|
|
|
|
namespace bi = boost::intrusive;
|
|
|
|
|
|
|
|
//----------------------------------------------------------------
|
|
|
|
|
|
|
|
namespace bcache {
|
|
|
|
// FIXME: move to base?
|
|
|
|
|
|
|
|
namespace mempool_detail {
|
2016-05-07 16:17:40 +05:30
|
|
|
struct alloc_block : public bi::list_base_hook<bi::link_mode<bi::normal_link>> {
|
2016-04-14 13:24:32 +05:30
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
class mempool {
|
|
|
|
public:
|
2016-05-07 16:17:40 +05:30
|
|
|
// alignment must be a power of 2
|
|
|
|
mempool(size_t block_size, size_t total_mem, size_t alignment = 8);
|
2016-04-14 13:24:32 +05:30
|
|
|
~mempool();
|
|
|
|
|
2016-06-01 19:16:27 +05:30
|
|
|
void *alloc();
|
2016-04-14 13:24:32 +05:30
|
|
|
void free(void *data);
|
|
|
|
|
|
|
|
private:
|
|
|
|
static void *alloc_aligned(size_t len, size_t alignment);
|
|
|
|
|
|
|
|
using block_list = bi::list<mempool_detail::alloc_block>;
|
|
|
|
|
|
|
|
void *mem_;
|
|
|
|
block_list free_;
|
|
|
|
|
|
|
|
//----------------
|
|
|
|
|
|
|
|
mempool(mempool const &) = delete;
|
|
|
|
mempool &operator =(mempool const &) = delete;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------------------------------------------------
|
|
|
|
|
|
|
|
#endif
|