47 lines
		
	
	
		
			961 B
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			961 B
		
	
	
	
		
			C++
		
	
	
	
	
	
#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 {
 | 
						|
		struct alloc_block : public bi::list_base_hook<bi::link_mode<bi::normal_link>> {
 | 
						|
		};
 | 
						|
	};
 | 
						|
 | 
						|
	class mempool {
 | 
						|
	public:
 | 
						|
		// alignment must be a power of 2
 | 
						|
		mempool(size_t block_size, size_t total_mem, size_t alignment = 8);
 | 
						|
		~mempool();
 | 
						|
 | 
						|
		void *alloc();
 | 
						|
		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
 |