diff options
author | lloyd <[email protected]> | 2006-05-18 18:33:19 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2006-05-18 18:33:19 +0000 |
commit | a2c99d3270eb73ef2db5704fc54356c6b75096f8 (patch) | |
tree | ad3d6c4fcc8dd0f403f8105598943616246fe172 /include/mem_pool.h |
Initial checkin1.5.6
Diffstat (limited to 'include/mem_pool.h')
-rw-r--r-- | include/mem_pool.h | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/include/mem_pool.h b/include/mem_pool.h new file mode 100644 index 000000000..59599d65c --- /dev/null +++ b/include/mem_pool.h @@ -0,0 +1,70 @@ +/************************************************* +* Pooling Allocator Header File * +* (C) 1999-2006 The Botan Project * +*************************************************/ + +#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 Pooling_Allocator : public Allocator + { + public: + void* allocate(u32bit); + void deallocate(void*, u32bit); + + void init(); + void destroy(); + + Pooling_Allocator(u32bit, bool); + ~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*, u32bit, u32bit); + + static u32bit bitmap_size() { return BITMAP_SIZE; } + + bool contains(void*, u32bit) const throw(); + byte* alloc(u32bit) throw(); + void free(void*, u32bit) throw(); + + bool cmp_mem(const void* x) const { return (*this) < x; } + bool operator<(const void*) const; + bool operator<(const Memory_Block&) const; + private: + typedef u64bit bitmap_type; + static const u32bit BITMAP_SIZE = 8 * sizeof(bitmap_type); + bitmap_type bitmap; + byte* buffer, *buffer_end; + u32bit block_size; + }; + + const u32bit PREF_SIZE, BLOCK_SIZE; + + std::vector<Memory_Block> blocks; + std::vector<Memory_Block>::iterator last_used; + std::vector<std::pair<void*, u32bit> > allocated; + Mutex* mutex; + }; + +} + +#endif |