diff options
author | lloyd <[email protected]> | 2008-11-08 19:59:19 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2008-11-08 19:59:19 +0000 |
commit | c0e3dc424479a09f9e320625d64d230cc952b22b (patch) | |
tree | e337c31a3d0c5b6a0d9839bfc01b89c41e3058f8 /src/alloc/mem_pool/mem_pool.h | |
parent | a91a427f69405aae9e662551472f7358ef9e4244 (diff) |
Continue to dismantle the core module (aka ball of mud), moving allocator
code to alloc/ subdirs
Diffstat (limited to 'src/alloc/mem_pool/mem_pool.h')
-rw-r--r-- | src/alloc/mem_pool/mem_pool.h | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/alloc/mem_pool/mem_pool.h b/src/alloc/mem_pool/mem_pool.h new file mode 100644 index 000000000..b74e08a8d --- /dev/null +++ b/src/alloc/mem_pool/mem_pool.h @@ -0,0 +1,74 @@ +/************************************************* +* Pooling Allocator Header File * +* (C) 1999-2007 Jack Lloyd * +*************************************************/ + +#ifndef BOTAN_POOLING_ALLOCATOR_H__ +#define BOTAN_POOLING_ALLOCATOR_H__ + +#include <botan/allocate.h> +#include <botan/exceptn.h> +#include <botan/mutex.h> +#include <utility> +#include <vector> + +namespace Botan { + +/************************************************* +* Pooling Allocator * +*************************************************/ +class BOTAN_DLL Pooling_Allocator : public Allocator + { + public: + void* allocate(u32bit); + void deallocate(void*, u32bit); + + void destroy(); + + Pooling_Allocator(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 BOTAN_DLL 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 throw(); + byte* alloc(u32bit) throw(); + void free(void*, u32bit) throw(); + + 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; + }; + + static const u32bit PREF_SIZE = BOTAN_MEM_POOL_CHUNK_SIZE; + + std::vector<Memory_Block> blocks; + std::vector<Memory_Block>::iterator last_used; + std::vector<std::pair<void*, u32bit> > allocated; + Mutex* mutex; + }; + +} + +#endif |