diff options
Diffstat (limited to 'botan/src/alloc/system_alloc/defalloc.cpp')
-rw-r--r-- | botan/src/alloc/system_alloc/defalloc.cpp | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/botan/src/alloc/system_alloc/defalloc.cpp b/botan/src/alloc/system_alloc/defalloc.cpp new file mode 100644 index 0000000..8791c74 --- /dev/null +++ b/botan/src/alloc/system_alloc/defalloc.cpp @@ -0,0 +1,100 @@ +/* +* Basic Allocators +* (C) 1999-2007 Jack Lloyd +* +* Distributed under the terms of the Botan license +*/ + +#include <botan/defalloc.h> +#include <botan/libstate.h> +#include <botan/util.h> +#include <cstdlib> +#include <cstring> + +namespace Botan { + +namespace { + +/* +* Perform Memory Allocation +*/ +void* do_malloc(u32bit n, bool do_lock) + { + void* ptr = std::malloc(n); + + if(!ptr) + return 0; + + if(do_lock) + lock_mem(ptr, n); + + std::memset(ptr, 0, n); + return ptr; + } + +/* +* Perform Memory Deallocation +*/ +void do_free(void* ptr, u32bit n, bool do_lock) + { + if(!ptr) + return; + + std::memset(ptr, 0, n); + if(do_lock) + unlock_mem(ptr, n); + + std::free(ptr); + } + +} + +/* +* Malloc_Allocator's Allocation +*/ +void* Malloc_Allocator::allocate(u32bit n) + { + return do_malloc(n, false); + } + +/* +* Malloc_Allocator's Deallocation +*/ +void Malloc_Allocator::deallocate(void* ptr, u32bit n) + { + do_free(ptr, n, false); + } + +/* +* Locking_Allocator's Allocation +*/ +void* Locking_Allocator::alloc_block(u32bit n) + { + return do_malloc(n, true); + } + +/* +* Locking_Allocator's Deallocation +*/ +void Locking_Allocator::dealloc_block(void* ptr, u32bit n) + { + do_free(ptr, n, true); + } + +/* +* Get an allocator +*/ +Allocator* Allocator::get(bool locking) + { + std::string type = ""; + if(!locking) + type = "malloc"; + + Allocator* alloc = global_state().get_allocator(type); + if(alloc) + return alloc; + + throw Exception("Couldn't find an allocator to use in get_allocator"); + } + +} |