/* * Pooling Allocator * (C) 1999-2007 Jack Lloyd * * Distributed under the terms of the Botan license */ #ifndef BOTAN_POOLING_ALLOCATOR_H__ #define BOTAN_POOLING_ALLOCATOR_H__ #include #include #include #include #include namespace Botan { /** * Pooling Allocator */ class Pooling_Allocator : public Allocator { public: void* allocate(u32bit); void deallocate(void*, u32bit); void destroy(); /** * @param mutex used for internal locking */ Pooling_Allocator(Mutex* mutex); ~Pooling_Allocator(); private: void get_more_core(u32bit); byte* allocate_blocks(u32bit); virtual void* alloc_block(u32bit) = 0; virtual void dealloc_block(void*, u32bit) = 0; class Memory_Block { public: Memory_Block(void*); static u32bit bitmap_size() { return BITMAP_SIZE; } static u32bit block_size() { return BLOCK_SIZE; } bool contains(void*, u32bit) const; byte* alloc(u32bit); void free(void*, u32bit); bool operator<(const Memory_Block& other) const { if(buffer < other.buffer && other.buffer < buffer_end) return false; return (buffer < other.buffer); } private: typedef u64bit bitmap_type; static const u32bit BITMAP_SIZE = 8 * sizeof(bitmap_type); static const u32bit BLOCK_SIZE = 64; bitmap_type bitmap; byte* buffer, *buffer_end; }; std::vector blocks; std::vector::iterator last_used; std::vector > allocated; Mutex* mutex; }; } #endif