diff options
Diffstat (limited to 'src/secalloc')
-rw-r--r-- | src/secalloc/alloc_mmap/info.txt | 25 | ||||
-rw-r--r-- | src/secalloc/alloc_mmap/mmap_mem.cpp | 128 | ||||
-rw-r--r-- | src/secalloc/alloc_mmap/mmap_mem.h | 28 | ||||
-rw-r--r-- | src/secalloc/allocators/allocate.h | 35 | ||||
-rw-r--r-- | src/secalloc/allocators/defalloc.cpp | 98 | ||||
-rw-r--r-- | src/secalloc/allocators/defalloc.h | 41 | ||||
-rw-r--r-- | src/secalloc/allocators/info.txt | 14 | ||||
-rw-r--r-- | src/secalloc/allocators/mem_pool.cpp | 260 | ||||
-rw-r--r-- | src/secalloc/allocators/mem_pool.h | 74 | ||||
-rw-r--r-- | src/secalloc/allocators/secmem.h | 217 |
10 files changed, 0 insertions, 920 deletions
diff --git a/src/secalloc/alloc_mmap/info.txt b/src/secalloc/alloc_mmap/info.txt deleted file mode 100644 index 8cc2b206e..000000000 --- a/src/secalloc/alloc_mmap/info.txt +++ /dev/null @@ -1,25 +0,0 @@ -realname "Disk Based Allocation System" - -define ALLOC_MMAP -modset unix - -load_on auto - -<add> -mmap_mem.cpp -mmap_mem.h -</add> - -<os> -linux -freebsd -openbsd -netbsd -solaris -qnx -darwin -tru64 - -# Only without -ansi, otherwise can't get mkstemp -#cygwin -</os> diff --git a/src/secalloc/alloc_mmap/mmap_mem.cpp b/src/secalloc/alloc_mmap/mmap_mem.cpp deleted file mode 100644 index e9ea17a53..000000000 --- a/src/secalloc/alloc_mmap/mmap_mem.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/************************************************* -* Memory Mapping Allocator Source File * -* (C) 1999-2007 Jack Lloyd * -*************************************************/ - -#include <botan/mmap_mem.h> -#include <cstring> - -#ifndef _XOPEN_SOURCE - #define _XOPEN_SOURCE 500 -#endif - -#ifndef _XOPEN_SOURCE_EXTENDED - #define _XOPEN_SOURCE_EXTENDED 1 -#endif - -#include <sys/types.h> -#include <sys/mman.h> -#include <sys/stat.h> -#include <unistd.h> -#include <stdlib.h> -#include <fcntl.h> - -#ifndef MAP_FAILED - #define MAP_FAILED -1 -#endif - -namespace Botan { - -namespace { - -/************************************************* -* MemoryMapping_Allocator Exception * -*************************************************/ -class MemoryMapping_Failed : public Exception - { - public: - MemoryMapping_Failed(const std::string& msg) : - Exception("MemoryMapping_Allocator: " + msg) {} - }; - -} - -/************************************************* -* Memory Map a File into Memory * -*************************************************/ -void* MemoryMapping_Allocator::alloc_block(u32bit n) - { - class TemporaryFile - { - public: - int get_fd() const { return fd; } - const std::string path() const { return filepath; } - - TemporaryFile(const std::string& base) - { - const std::string path = base + "XXXXXX"; - - filepath = new char[path.length() + 1]; - std::strcpy(filepath, path.c_str()); - - mode_t old_umask = ::umask(077); - fd = ::mkstemp(filepath); - ::umask(old_umask); - } - - ~TemporaryFile() - { - delete[] filepath; - if(fd != -1 && ::close(fd) == -1) - throw MemoryMapping_Failed("Could not close file"); - } - private: - int fd; - char* filepath; - }; - - TemporaryFile file("/tmp/botan_"); - - if(file.get_fd() == -1) - throw MemoryMapping_Failed("Could not create file"); - - if(::unlink(file.path().c_str())) - throw MemoryMapping_Failed("Could not unlink file '" + file.path() + "'"); - - ::lseek(file.get_fd(), n-1, SEEK_SET); - if(::write(file.get_fd(), "\0", 1) != 1) - throw MemoryMapping_Failed("Could not write to file"); - -#ifndef MAP_NOSYNC - #define MAP_NOSYNC 0 -#endif - - void* ptr = ::mmap(0, n, - PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_NOSYNC, - file.get_fd(), 0); - - if(ptr == static_cast<void*>(MAP_FAILED)) - throw MemoryMapping_Failed("Could not map file"); - - return ptr; - } - -/************************************************* -* Remove a Memory Mapping * -*************************************************/ -void MemoryMapping_Allocator::dealloc_block(void* ptr, u32bit n) - { - if(ptr == 0) - return; - - const byte PATTERNS[] = { 0x00, 0xFF, 0xAA, 0x55, 0x73, 0x8C, 0x5F, 0xA0, - 0x6E, 0x91, 0x30, 0xCF, 0xD3, 0x2C, 0xAC, 0x00 }; - - for(u32bit j = 0; j != sizeof(PATTERNS); j++) - { - std::memset(ptr, PATTERNS[j], n); - - if(::msync(ptr, n, MS_SYNC)) - throw MemoryMapping_Failed("Sync operation failed"); - } - - if(::munmap(ptr, n)) - throw MemoryMapping_Failed("Could not unmap file"); - } - -} diff --git a/src/secalloc/alloc_mmap/mmap_mem.h b/src/secalloc/alloc_mmap/mmap_mem.h deleted file mode 100644 index 740aa9ec6..000000000 --- a/src/secalloc/alloc_mmap/mmap_mem.h +++ /dev/null @@ -1,28 +0,0 @@ -/************************************************* -* Memory Mapping Allocator Header File * -* (C) 1999-2007 Jack Lloyd * -*************************************************/ - -#ifndef BOTAN_MMAP_ALLOCATOR_H__ -#define BOTAN_MMAP_ALLOCATOR_H__ - -#include <botan/mem_pool.h> - -namespace Botan { - -/************************************************* -* Memory Mapping Allocator * -*************************************************/ -class MemoryMapping_Allocator : public Pooling_Allocator - { - public: - MemoryMapping_Allocator(Mutex* m) : Pooling_Allocator(m) {} - std::string type() const { return "mmap"; } - private: - void* alloc_block(u32bit); - void dealloc_block(void*, u32bit); - }; - -} - -#endif diff --git a/src/secalloc/allocators/allocate.h b/src/secalloc/allocators/allocate.h deleted file mode 100644 index efbb77291..000000000 --- a/src/secalloc/allocators/allocate.h +++ /dev/null @@ -1,35 +0,0 @@ -/************************************************* -* Allocator Header File * -* (C) 1999-2007 Jack Lloyd * -*************************************************/ - -#ifndef BOTAN_ALLOCATOR_H__ -#define BOTAN_ALLOCATOR_H__ - -#include <botan/types.h> -#include <string> - -namespace Botan { - -/************************************************* -* Allocator Interface * -*************************************************/ -class BOTAN_DLL Allocator - { - public: - static Allocator* get(bool); - - virtual void* allocate(u32bit) = 0; - virtual void deallocate(void*, u32bit) = 0; - - virtual std::string type() const = 0; - - virtual void init() {} - virtual void destroy() {} - - virtual ~Allocator() {} - }; - -} - -#endif diff --git a/src/secalloc/allocators/defalloc.cpp b/src/secalloc/allocators/defalloc.cpp deleted file mode 100644 index 5fb8e1447..000000000 --- a/src/secalloc/allocators/defalloc.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/************************************************* -* Basic Allocators Source File * -* (C) 1999-2007 Jack Lloyd * -*************************************************/ - -#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"); - } - -} diff --git a/src/secalloc/allocators/defalloc.h b/src/secalloc/allocators/defalloc.h deleted file mode 100644 index dc01ee47f..000000000 --- a/src/secalloc/allocators/defalloc.h +++ /dev/null @@ -1,41 +0,0 @@ -/************************************************* -* Basic Allocators Header File * -* (C) 1999-2007 Jack Lloyd * -*************************************************/ - -#ifndef BOTAN_BASIC_ALLOC_H__ -#define BOTAN_BASIC_ALLOC_H__ - -#include <botan/mem_pool.h> - -namespace Botan { - -/************************************************* -* Malloc Allocator * -*************************************************/ -class BOTAN_DLL Malloc_Allocator : public Allocator - { - public: - void* allocate(u32bit); - void deallocate(void*, u32bit); - - std::string type() const { return "malloc"; } - }; - -/************************************************* -* Locking Allocator * -*************************************************/ -class BOTAN_DLL Locking_Allocator : public Pooling_Allocator - { - public: - Locking_Allocator(Mutex* m) : Pooling_Allocator(m) {} - - std::string type() const { return "locking"; } - private: - void* alloc_block(u32bit); - void dealloc_block(void*, u32bit); - }; - -} - -#endif diff --git a/src/secalloc/allocators/info.txt b/src/secalloc/allocators/info.txt deleted file mode 100644 index e2d8d2a16..000000000 --- a/src/secalloc/allocators/info.txt +++ /dev/null @@ -1,14 +0,0 @@ -realname "Secure Memory Allocation" - -load_on auto - -define SECMEM - -<add> -defalloc.cpp -mem_pool.cpp -allocate.h -defalloc.h -mem_pool.h -secmem.h -</add> diff --git a/src/secalloc/allocators/mem_pool.cpp b/src/secalloc/allocators/mem_pool.cpp deleted file mode 100644 index c99d627ad..000000000 --- a/src/secalloc/allocators/mem_pool.cpp +++ /dev/null @@ -1,260 +0,0 @@ -/************************************************* -* Pooling Allocator Source File * -* (C) 1999-2008 Jack Lloyd * -* 2005 Matthew Gregan * -* 2005-2006 Matt Johnston * -*************************************************/ - -#include <botan/mem_pool.h> -#include <botan/util.h> -#include <botan/mem_ops.h> -#include <algorithm> -#include <exception> - -namespace Botan { - -namespace { - -/************************************************* -* Memory Allocation Exception * -*************************************************/ -struct Memory_Exhaustion : public std::bad_alloc - { - const char* what() const throw() - { return "Ran out of memory, allocation failed"; } - }; - -} - -/************************************************* -* Memory_Block Constructor * -*************************************************/ -Pooling_Allocator::Memory_Block::Memory_Block(void* buf) - { - buffer = static_cast<byte*>(buf); - bitmap = 0; - buffer_end = buffer + (BLOCK_SIZE * BITMAP_SIZE); - } - -/************************************************* -* See if ptr is contained by this block * -*************************************************/ -bool Pooling_Allocator::Memory_Block::contains(void* ptr, - u32bit length) const throw() - { - return ((buffer <= ptr) && - (buffer_end >= static_cast<byte*>(ptr) + length * BLOCK_SIZE)); - } - -/************************************************* -* Allocate some memory, if possible * -*************************************************/ -byte* Pooling_Allocator::Memory_Block::alloc(u32bit n) throw() - { - if(n == 0 || n > BITMAP_SIZE) - return 0; - - if(n == BITMAP_SIZE) - { - if(bitmap) - return 0; - else - { - bitmap = ~bitmap; - return buffer; - } - } - - bitmap_type mask = (static_cast<bitmap_type>(1) << n) - 1; - u32bit offset = 0; - - while(bitmap & mask) - { - mask <<= 1; - ++offset; - - if((bitmap & mask) == 0) - break; - if(mask >> 63) - break; - } - - if(bitmap & mask) - return 0; - - bitmap |= mask; - return buffer + offset * BLOCK_SIZE; - } - -/************************************************* -* Mark this memory as free, if we own it * -*************************************************/ -void Pooling_Allocator::Memory_Block::free(void* ptr, u32bit blocks) throw() - { - clear_mem(static_cast<byte*>(ptr), blocks * BLOCK_SIZE); - - const u32bit offset = (static_cast<byte*>(ptr) - buffer) / BLOCK_SIZE; - - if(offset == 0 && blocks == BITMAP_SIZE) - bitmap = ~bitmap; - else - { - for(u32bit j = 0; j != blocks; ++j) - bitmap &= ~(static_cast<bitmap_type>(1) << (j+offset)); - } - } - -/************************************************* -* Pooling_Allocator Constructor * -*************************************************/ -Pooling_Allocator::Pooling_Allocator(Mutex* m) : mutex(m) - { - last_used = blocks.begin(); - } - -/************************************************* -* Pooling_Allocator Destructor * -*************************************************/ -Pooling_Allocator::~Pooling_Allocator() - { - delete mutex; - if(blocks.size()) - throw Invalid_State("Pooling_Allocator: Never released memory"); - } - -/************************************************* -* Free all remaining memory * -*************************************************/ -void Pooling_Allocator::destroy() - { - Mutex_Holder lock(mutex); - - blocks.clear(); - - for(u32bit j = 0; j != allocated.size(); ++j) - dealloc_block(allocated[j].first, allocated[j].second); - allocated.clear(); - } - -/************************************************* -* Allocation * -*************************************************/ -void* Pooling_Allocator::allocate(u32bit n) - { - const u32bit BITMAP_SIZE = Memory_Block::bitmap_size(); - const u32bit BLOCK_SIZE = Memory_Block::block_size(); - - Mutex_Holder lock(mutex); - - if(n <= BITMAP_SIZE * BLOCK_SIZE) - { - const u32bit block_no = round_up(n, BLOCK_SIZE) / BLOCK_SIZE; - - byte* mem = allocate_blocks(block_no); - if(mem) - return mem; - - get_more_core(PREF_SIZE); - - mem = allocate_blocks(block_no); - if(mem) - return mem; - - throw Memory_Exhaustion(); - } - - void* new_buf = alloc_block(n); - if(new_buf) - return new_buf; - - throw Memory_Exhaustion(); - } - -/************************************************* -* Deallocation * -*************************************************/ -void Pooling_Allocator::deallocate(void* ptr, u32bit n) - { - const u32bit BITMAP_SIZE = Memory_Block::bitmap_size(); - const u32bit BLOCK_SIZE = Memory_Block::block_size(); - - if(ptr == 0 && n == 0) - return; - - Mutex_Holder lock(mutex); - - if(n > BITMAP_SIZE * BLOCK_SIZE) - dealloc_block(ptr, n); - else - { - const u32bit block_no = round_up(n, BLOCK_SIZE) / BLOCK_SIZE; - - std::vector<Memory_Block>::iterator i = - std::lower_bound(blocks.begin(), blocks.end(), Memory_Block(ptr)); - - if(i == blocks.end() || !i->contains(ptr, block_no)) - throw Invalid_State("Pointer released to the wrong allocator"); - - i->free(ptr, block_no); - } - } - -/************************************************* -* Try to get some memory from an existing block * -*************************************************/ -byte* Pooling_Allocator::allocate_blocks(u32bit n) - { - if(blocks.empty()) - return 0; - - std::vector<Memory_Block>::iterator i = last_used; - - do - { - byte* mem = i->alloc(n); - if(mem) - { - last_used = i; - return mem; - } - - ++i; - if(i == blocks.end()) - i = blocks.begin(); - } - while(i != last_used); - - return 0; - } - -/************************************************* -* Allocate more memory for the pool * -*************************************************/ -void Pooling_Allocator::get_more_core(u32bit in_bytes) - { - const u32bit BITMAP_SIZE = Memory_Block::bitmap_size(); - const u32bit BLOCK_SIZE = Memory_Block::block_size(); - - const u32bit TOTAL_BLOCK_SIZE = BLOCK_SIZE * BITMAP_SIZE; - - const u32bit in_blocks = round_up(in_bytes, BLOCK_SIZE) / TOTAL_BLOCK_SIZE; - const u32bit to_allocate = in_blocks * TOTAL_BLOCK_SIZE; - - void* ptr = alloc_block(to_allocate); - if(ptr == 0) - throw Memory_Exhaustion(); - - allocated.push_back(std::make_pair(ptr, to_allocate)); - - for(u32bit j = 0; j != in_blocks; ++j) - { - byte* byte_ptr = static_cast<byte*>(ptr); - blocks.push_back(Memory_Block(byte_ptr + j * TOTAL_BLOCK_SIZE)); - } - - std::sort(blocks.begin(), blocks.end()); - last_used = std::lower_bound(blocks.begin(), blocks.end(), - Memory_Block(ptr)); - } - -} diff --git a/src/secalloc/allocators/mem_pool.h b/src/secalloc/allocators/mem_pool.h deleted file mode 100644 index b74e08a8d..000000000 --- a/src/secalloc/allocators/mem_pool.h +++ /dev/null @@ -1,74 +0,0 @@ -/************************************************* -* 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 diff --git a/src/secalloc/allocators/secmem.h b/src/secalloc/allocators/secmem.h deleted file mode 100644 index 37adf7f42..000000000 --- a/src/secalloc/allocators/secmem.h +++ /dev/null @@ -1,217 +0,0 @@ -/************************************************* -* Secure Memory Buffers Header File * -* (C) 1999-2007 Jack Lloyd * -*************************************************/ - -#ifndef BOTAN_SECURE_MEMORY_BUFFERS_H__ -#define BOTAN_SECURE_MEMORY_BUFFERS_H__ - -#include <botan/allocate.h> -#include <botan/mem_ops.h> - -namespace Botan { - -/************************************************* -* Variable Length Memory Buffer * -*************************************************/ -template<typename T> -class MemoryRegion - { - public: - u32bit size() const { return used; } - u32bit is_empty() const { return (used == 0); } - u32bit has_items() const { return (used != 0); } - - operator T* () { return buf; } - operator const T* () const { return buf; } - - T* begin() { return buf; } - const T* begin() const { return buf; } - - T* end() { return (buf + size()); } - const T* end() const { return (buf + size()); } - - bool operator==(const MemoryRegion<T>& other) const - { - return (size() == other.size() && - same_mem(buf, other.buf, size())); - } - - bool operator<(const MemoryRegion<T>&) const; - - bool operator!=(const MemoryRegion<T>& in) const - { return (!(*this == in)); } - MemoryRegion<T>& operator=(const MemoryRegion<T>& in) - { if(this != &in) set(in); return (*this); } - - void copy(const T in[], u32bit n) - { copy(0, in, n); } - void copy(u32bit off, const T in[], u32bit n) - { copy_mem(buf + off, in, (n > size() - off) ? (size() - off) : n); } - - void set(const T in[], u32bit n) { create(n); copy(in, n); } - void set(const MemoryRegion<T>& in) { set(in.begin(), in.size()); } - - void append(const T data[], u32bit n) - { grow_to(size()+n); copy(size() - n, data, n); } - void append(T x) { append(&x, 1); } - void append(const MemoryRegion<T>& x) { append(x.begin(), x.size()); } - - void clear() { clear_mem(buf, allocated); } - void destroy() { create(0); } - - void create(u32bit); - void grow_to(u32bit); - void swap(MemoryRegion<T>&); - - ~MemoryRegion() { deallocate(buf, allocated); } - protected: - MemoryRegion() { buf = 0; alloc = 0; used = allocated = 0; } - MemoryRegion(const MemoryRegion<T>& other) - { - buf = 0; - used = allocated = 0; - alloc = other.alloc; - set(other.buf, other.used); - } - - void init(bool locking, u32bit length = 0) - { alloc = Allocator::get(locking); create(length); } - private: - T* allocate(u32bit n) - { - return static_cast<T*>(alloc->allocate(sizeof(T)*n)); - } - - void deallocate(T* p, u32bit n) - { alloc->deallocate(p, sizeof(T)*n); } - - T* buf; - u32bit used; - u32bit allocated; - Allocator* alloc; - }; - -/************************************************* -* Create a new buffer * -*************************************************/ -template<typename T> -void MemoryRegion<T>::create(u32bit n) - { - if(n <= allocated) { clear(); used = n; return; } - deallocate(buf, allocated); - buf = allocate(n); - allocated = used = n; - } - -/************************************************* -* Increase the size of the buffer * -*************************************************/ -template<typename T> -void MemoryRegion<T>::grow_to(u32bit n) - { - if(n > used && n <= allocated) - { - clear_mem(buf + used, n - used); - used = n; - return; - } - else if(n > allocated) - { - T* new_buf = allocate(n); - copy_mem(new_buf, buf, used); - deallocate(buf, allocated); - buf = new_buf; - allocated = used = n; - } - } - -/************************************************* -* Compare this buffer with another one * -*************************************************/ -template<typename T> -bool MemoryRegion<T>::operator<(const MemoryRegion<T>& in) const - { - if(size() < in.size()) return true; - if(size() > in.size()) return false; - - for(u32bit j = 0; j != size(); j++) - { - if(buf[j] < in[j]) return true; - if(buf[j] > in[j]) return false; - } - - return false; - } - -/************************************************* -* Swap this buffer with another one * -*************************************************/ -template<typename T> -void MemoryRegion<T>::swap(MemoryRegion<T>& x) - { - std::swap(buf, x.buf); - std::swap(used, x.used); - std::swap(allocated, x.allocated); - std::swap(alloc, x.alloc); - } - -/************************************************* -* Unlocked Variable Length Buffer * -*************************************************/ -template<typename T> -class MemoryVector : public MemoryRegion<T> - { - public: - MemoryVector<T>& operator=(const MemoryRegion<T>& in) - { if(this != &in) set(in); return (*this); } - - MemoryVector(u32bit n = 0) { MemoryRegion<T>::init(false, n); } - MemoryVector(const T in[], u32bit n) - { MemoryRegion<T>::init(false); set(in, n); } - MemoryVector(const MemoryRegion<T>& in) - { MemoryRegion<T>::init(false); set(in); } - MemoryVector(const MemoryRegion<T>& in1, const MemoryRegion<T>& in2) - { MemoryRegion<T>::init(false); set(in1); append(in2); } - }; - -/************************************************* -* Locked Variable Length Buffer * -*************************************************/ -template<typename T> -class SecureVector : public MemoryRegion<T> - { - public: - SecureVector<T>& operator=(const MemoryRegion<T>& in) - { if(this != &in) set(in); return (*this); } - - SecureVector(u32bit n = 0) { MemoryRegion<T>::init(true, n); } - SecureVector(const T in[], u32bit n) - { MemoryRegion<T>::init(true); set(in, n); } - SecureVector(const MemoryRegion<T>& in) - { MemoryRegion<T>::init(true); set(in); } - SecureVector(const MemoryRegion<T>& in1, const MemoryRegion<T>& in2) - { MemoryRegion<T>::init(true); set(in1); append(in2); } - }; - -/************************************************* -* Locked Fixed Length Buffer * -*************************************************/ -template<typename T, u32bit L> -class SecureBuffer : public MemoryRegion<T> - { - public: - SecureBuffer<T,L>& operator=(const SecureBuffer<T,L>& in) - { if(this != &in) set(in); return (*this); } - - SecureBuffer() { MemoryRegion<T>::init(true, L); } - SecureBuffer(const T in[], u32bit n) - { MemoryRegion<T>::init(true, L); copy(in, n); } - private: - SecureBuffer<T, L>& operator=(const MemoryRegion<T>& in) - { if(this != &in) set(in); return (*this); } - }; - -} - -#endif |