aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/allocate.h3
-rw-r--r--include/libstate.h4
-rw-r--r--include/mem_pool.h4
-rw-r--r--include/secmem.h4
-rw-r--r--src/allocate.cpp23
-rw-r--r--src/defalloc.cpp17
-rw-r--r--src/libstate.cpp38
-rw-r--r--src/mem_pool.cpp10
8 files changed, 49 insertions, 54 deletions
diff --git a/include/allocate.h b/include/allocate.h
index d30e4e0bc..6472924d5 100644
--- a/include/allocate.h
+++ b/include/allocate.h
@@ -17,6 +17,8 @@ namespace Botan {
class Allocator
{
public:
+ static Allocator* get(bool);
+
virtual void* allocate(u32bit) = 0;
virtual void deallocate(void*, u32bit) = 0;
@@ -31,7 +33,6 @@ class Allocator
/*************************************************
* Get an allocator *
*************************************************/
-Allocator* get_allocator(const std::string& = "");
}
diff --git a/include/libstate.h b/include/libstate.h
index 5bfb4018d..ece05609a 100644
--- a/include/libstate.h
+++ b/include/libstate.h
@@ -31,7 +31,8 @@ class Library_State
friend class Engine_Iterator;
Allocator* get_allocator(const std::string& = "") const;
- void add_allocator(Allocator*, bool = false);
+ void add_allocator(Allocator*);
+ void set_default_allocator(const std::string&) const;
void set_prng(RandomNumberGenerator*);
void randomize(byte[], u32bit);
@@ -78,6 +79,7 @@ class Library_State
class Charset_Transcoder* transcoder;
RandomNumberGenerator* rng;
+ std::vector<Allocator*> allocators;
std::vector<EntropySource*> entropy_sources;
std::vector<class Engine*> engines;
};
diff --git a/include/mem_pool.h b/include/mem_pool.h
index 59599d65c..e365cd29d 100644
--- a/include/mem_pool.h
+++ b/include/mem_pool.h
@@ -46,9 +46,9 @@ class Pooling_Allocator : public Allocator
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;
+ bool operator<(const Memory_Block& other) const
+ { return (buffer < other.buffer); }
private:
typedef u64bit bitmap_type;
static const u32bit BITMAP_SIZE = 8 * sizeof(bitmap_type);
diff --git a/include/secmem.h b/include/secmem.h
index 84c821ec7..7873c8b1f 100644
--- a/include/secmem.h
+++ b/include/secmem.h
@@ -75,8 +75,8 @@ class MemoryRegion
set(copy.buf, copy.used);
}
- void init(bool lock, u32bit size = 0)
- { alloc = get_allocator(lock ? "" : "malloc"); create(size); }
+ void init(bool locking, u32bit size = 0)
+ { alloc = Allocator::get(locking); create(size); }
private:
T* allocate(u32bit n) const { return (T*)alloc->allocate(sizeof(T)*n); }
void deallocate(T* p, u32bit n) const
diff --git a/src/allocate.cpp b/src/allocate.cpp
deleted file mode 100644
index 72b1f873a..000000000
--- a/src/allocate.cpp
+++ /dev/null
@@ -1,23 +0,0 @@
-/*************************************************
-* Allocator Factory Source File *
-* (C) 1999-2006 The Botan Project *
-*************************************************/
-
-#include <botan/allocate.h>
-#include <botan/libstate.h>
-
-namespace Botan {
-
-/*************************************************
-* Get an allocator *
-*************************************************/
-Allocator* get_allocator(const std::string& type)
- {
- 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/defalloc.cpp b/src/defalloc.cpp
index ad54fb3ca..5b61e7fac 100644
--- a/src/defalloc.cpp
+++ b/src/defalloc.cpp
@@ -4,6 +4,7 @@
*************************************************/
#include <botan/defalloc.h>
+#include <botan/libstate.h>
#include <botan/util.h>
#include <cstdlib>
#include <cstring>
@@ -78,4 +79,20 @@ 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/libstate.cpp b/src/libstate.cpp
index 1bb27e74a..a782f4c60 100644
--- a/src/libstate.cpp
+++ b/src/libstate.cpp
@@ -110,21 +110,28 @@ Allocator* Library_State::get_allocator(const std::string& type) const
/*************************************************
* Create a new name to object mapping *
*************************************************/
-void Library_State::add_allocator(Allocator* allocator,
- bool set_as_default)
+void Library_State::add_allocator(Allocator* allocator)
{
Named_Mutex_Holder lock("allocator");
allocator->init();
- const std::string type = allocator->type();
- if(alloc_factory[type])
- delete alloc_factory[type];
+ allocators.push_back(allocator);
+ alloc_factory[allocator->type()] = allocator;
+ }
- alloc_factory[type] = allocator;
+/*************************************************
+* Set the default allocator type *
+*************************************************/
+void Library_State::set_default_allocator(const std::string& type) const
+ {
+ Named_Mutex_Holder lock("allocator");
- if(set_as_default)
- config().set("conf", "base/default_allocator", type);
+ if(type == "")
+ return;
+
+ config().set("conf", "base/default_allocator", type);
+ cached_default_allocator = 0;
}
/*************************************************
@@ -307,11 +314,11 @@ void Library_State::load(Modules& modules)
set_timer(modules.timer());
set_transcoder(modules.transcoder());
- std::vector<Allocator*> allocators = modules.allocators();
+ std::vector<Allocator*> mod_allocs = modules.allocators();
+ for(u32bit j = 0; j != mod_allocs.size(); j++)
+ add_allocator(mod_allocs[j]);
- for(u32bit j = 0; j != allocators.size(); j++)
- add_allocator(allocators[j],
- allocators[j]->type() == modules.default_allocator());
+ set_default_allocator(modules.default_allocator());
std::vector<Engine*> engines = modules.engines();
for(u32bit j = 0; j != engines.size(); ++j)
@@ -361,11 +368,10 @@ Library_State::~Library_State()
cached_default_allocator = 0;
- for(std::map<std::string, Allocator*>::iterator j = alloc_factory.begin();
- j != alloc_factory.end(); ++j)
+ for(u32bit j = 0; j != allocators.size(); j++)
{
- j->second->destroy();
- delete j->second;
+ allocators[j]->destroy();
+ delete allocators[j];
}
std::for_each(locks.begin(), locks.end(),
diff --git a/src/mem_pool.cpp b/src/mem_pool.cpp
index 00a9f2d06..24866d172 100644
--- a/src/mem_pool.cpp
+++ b/src/mem_pool.cpp
@@ -52,7 +52,7 @@ Pooling_Allocator::Memory_Block::Memory_Block(void* buf, u32bit map_size,
/*************************************************
* Compare a Memory_Block with a void pointer *
*************************************************/
-bool Pooling_Allocator::Memory_Block::operator<(const void* other) const
+inline bool Pooling_Allocator::Memory_Block::operator<(const void* other) const
{
if(buffer <= other && other < buffer_end)
return false;
@@ -60,14 +60,6 @@ bool Pooling_Allocator::Memory_Block::operator<(const void* other) const
}
/*************************************************
-* Compare two Memory_Block objects *
-*************************************************/
-bool Pooling_Allocator::Memory_Block::operator<(const Memory_Block& blk) const
- {
- return (buffer < blk.buffer);
- }
-
-/*************************************************
* See if ptr is contained by this block *
*************************************************/
bool Pooling_Allocator::Memory_Block::contains(void* ptr,