diff options
author | lloyd <[email protected]> | 2010-08-13 15:13:21 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2010-08-13 15:13:21 +0000 |
commit | 3da3b04e1ba1577b3d0e1b4b9b3f4b24381fc433 (patch) | |
tree | 8a4b3a3b8e830ffcbd41f41859db4ab4fd972fb2 /src/libstate | |
parent | 2cae6ec17984ad016f973d5925860278e575b3f4 (diff) | |
parent | 789cee0888bbede838a2a3cf6221677c9f172872 (diff) |
propagate from branch 'net.randombit.botan' (head 0a3348f52bf558bc2282e1066c2913a72a1aeda5)
to branch 'net.randombit.botan.c++0x' (head 552c20ae8874f12da779fc25ea368e36e71cbfe8)
Diffstat (limited to 'src/libstate')
-rw-r--r-- | src/libstate/global_rng.cpp | 21 | ||||
-rw-r--r-- | src/libstate/info.txt | 2 | ||||
-rw-r--r-- | src/libstate/init.cpp | 35 | ||||
-rw-r--r-- | src/libstate/libstate.cpp | 89 | ||||
-rw-r--r-- | src/libstate/libstate.h | 41 |
5 files changed, 51 insertions, 137 deletions
diff --git a/src/libstate/global_rng.cpp b/src/libstate/global_rng.cpp index 2678813f1..a79c72c00 100644 --- a/src/libstate/global_rng.cpp +++ b/src/libstate/global_rng.cpp @@ -6,7 +6,6 @@ */ #include <botan/libstate.h> -#include <botan/internal/mutex.h> #if defined(BOTAN_HAS_RANDPOOL) #include <botan/randpool.h> @@ -107,60 +106,60 @@ class Serialized_PRNG : public RandomNumberGenerator public: void randomize(byte out[], u32bit len) { - Mutex_Holder lock(mutex); + std::lock_guard<std::mutex> lock(mutex); rng->randomize(out, len); } bool is_seeded() const { - Mutex_Holder lock(mutex); + std::lock_guard<std::mutex> lock(mutex); return rng->is_seeded(); } void clear() { - Mutex_Holder lock(mutex); + std::lock_guard<std::mutex> lock(mutex); rng->clear(); } std::string name() const { - Mutex_Holder lock(mutex); + std::lock_guard<std::mutex> lock(mutex); return rng->name(); } void reseed(u32bit poll_bits) { - Mutex_Holder lock(mutex); + std::lock_guard<std::mutex> lock(mutex); rng->reseed(poll_bits); } void add_entropy_source(EntropySource* es) { - Mutex_Holder lock(mutex); + std::lock_guard<std::mutex> lock(mutex); rng->add_entropy_source(es); } void add_entropy(const byte in[], u32bit len) { - Mutex_Holder lock(mutex); + std::lock_guard<std::mutex> lock(mutex); rng->add_entropy(in, len); } // We do not own the mutex; Library_State does - Serialized_PRNG(RandomNumberGenerator* r, Mutex* m) : + Serialized_PRNG(RandomNumberGenerator* r, std::mutex& m) : mutex(m), rng(r) {} ~Serialized_PRNG() { delete rng; } private: - Mutex* mutex; + std::mutex& mutex; RandomNumberGenerator* rng; }; } RandomNumberGenerator* Library_State::make_global_rng(Algorithm_Factory& af, - Mutex* mutex) + std::mutex& mutex) { RandomNumberGenerator* rng = 0; diff --git a/src/libstate/info.txt b/src/libstate/info.txt index 94ae8101a..a017589fc 100644 --- a/src/libstate/info.txt +++ b/src/libstate/info.txt @@ -35,8 +35,6 @@ hash kdf mac mode_pad -mutex -noop_mutex pbkdf pk_pad pubkey diff --git a/src/libstate/init.cpp b/src/libstate/init.cpp index e2139f42e..5fd476994 100644 --- a/src/libstate/init.cpp +++ b/src/libstate/init.cpp @@ -1,12 +1,11 @@ /* * Default Initialization Function -* (C) 1999-2007 Jack Lloyd +* (C) 1999-2009 Jack Lloyd * * Distributed under the terms of the Botan license */ #include <botan/init.h> -#include <botan/parsing.h> #include <botan/libstate.h> #include <botan/global_state.h> @@ -15,36 +14,8 @@ namespace Botan { /* * Library Initialization */ -void LibraryInitializer::initialize(const std::string& arg_string) +void LibraryInitializer::initialize(const std::string&) { - bool thread_safe = false; - - const std::vector<std::string> arg_list = split_on(arg_string, ' '); - for(u32bit j = 0; j != arg_list.size(); ++j) - { - if(arg_list[j].size() == 0) - continue; - - std::string name, value; - - if(arg_list[j].find('=') == std::string::npos) - { - name = arg_list[j]; - value = "true"; - } - else - { - std::vector<std::string> name_and_value = split_on(arg_list[j], '='); - name = name_and_value[0]; - value = name_and_value[1]; - } - - bool is_on = - (value == "1" || value == "true" || value == "yes" || value == "on"); - - if(name == "thread_safe") - thread_safe = is_on; - } try { @@ -56,7 +27,7 @@ void LibraryInitializer::initialize(const std::string& arg_string) */ Global_State_Management::set_global_state(new Library_State); - global_state().initialize(thread_safe); + global_state().initialize(); } catch(...) { diff --git a/src/libstate/libstate.cpp b/src/libstate/libstate.cpp index a20fc76c6..0d7463306 100644 --- a/src/libstate/libstate.cpp +++ b/src/libstate/libstate.cpp @@ -11,8 +11,6 @@ #include <botan/cpuid.h> #include <botan/internal/defalloc.h> #include <botan/internal/core_engine.h> -#include <botan/internal/mutex.h> -#include <botan/internal/mux_noop.h> #include <botan/internal/stl_util.h> #include <botan/internal/mlock.h> #include <algorithm> @@ -21,14 +19,6 @@ #include <botan/selftest.h> #endif -#if defined(BOTAN_HAS_MUTEX_PTHREAD) - #include <botan/internal/mux_pthr.h> -#elif defined(BOTAN_HAS_MUTEX_WIN32) - #include <botan/internal/mux_win32.h> -#elif defined(BOTAN_HAS_MUTEX_QT) - #include <botan/internal/mux_qt.h> -#endif - #if defined(BOTAN_HAS_ALLOC_MMAP) #include <botan/internal/mmap_mem.h> #endif @@ -56,19 +46,11 @@ namespace Botan { /* -* Get a new mutex object -*/ -Mutex* Library_State::get_mutex() const - { - return mutex_factory->make(); - } - -/* * Get an allocator by its name */ -Allocator* Library_State::get_allocator(const std::string& type) const +Allocator* Library_State::get_allocator(const std::string& type) { - Mutex_Holder lock(allocator_lock); + std::lock_guard<std::mutex> lock(allocator_lock); if(type != "") return search_map<std::string, Allocator*>(alloc_factory, type, 0); @@ -88,7 +70,7 @@ Allocator* Library_State::get_allocator(const std::string& type) const */ void Library_State::add_allocator(Allocator* allocator) { - Mutex_Holder lock(allocator_lock); + std::lock_guard<std::mutex> lock(allocator_lock); allocator->init(); @@ -101,11 +83,11 @@ void Library_State::add_allocator(Allocator* allocator) */ void Library_State::set_default_allocator(const std::string& type) { - Mutex_Holder lock(allocator_lock); - if(type == "") return; + std::lock_guard<std::mutex> lock(allocator_lock); + default_allocator_name = type; cached_default_allocator = 0; } @@ -114,9 +96,9 @@ void Library_State::set_default_allocator(const std::string& type) * Get a configuration value */ std::string Library_State::get(const std::string& section, - const std::string& key) const + const std::string& key) { - Mutex_Holder lock(config_lock); + std::lock_guard<std::mutex> lock(config_lock); return search_map<std::string, std::string>(config, section + "/" + key, ""); @@ -126,9 +108,9 @@ std::string Library_State::get(const std::string& section, * See if a particular option has been set */ bool Library_State::is_set(const std::string& section, - const std::string& key) const + const std::string& key) { - Mutex_Holder lock(config_lock); + std::lock_guard<std::mutex> lock(config_lock); return search_map(config, section + "/" + key, false, true); } @@ -139,12 +121,11 @@ bool Library_State::is_set(const std::string& section, void Library_State::set(const std::string& section, const std::string& key, const std::string& value, bool overwrite) { - Mutex_Holder lock(config_lock); + std::lock_guard<std::mutex> lock(config_lock); std::string full_key = section + "/" + key; - std::map<std::string, std::string>::const_iterator i = - config.find(full_key); + auto i = config.find(full_key); if(overwrite || i == config.end() || i->second == "") config[full_key] = value; @@ -161,7 +142,7 @@ void Library_State::add_alias(const std::string& key, const std::string& value) /* * Dereference an alias to a fixed name */ -std::string Library_State::deref_alias(const std::string& key) const +std::string Library_State::deref_alias(const std::string& key) { std::string result = key; while(is_set("alias", result)) @@ -184,7 +165,7 @@ Algorithm_Factory& Library_State::algorithm_factory() const */ RandomNumberGenerator& Library_State::global_rng() { - Mutex_Holder lock(global_rng_lock); + std::lock_guard<std::mutex> lock(global_rng_lock); if(!global_rng_ptr) global_rng_ptr = make_global_rng(algorithm_factory(), @@ -196,46 +177,26 @@ RandomNumberGenerator& Library_State::global_rng() /* * Load a set of modules */ -void Library_State::initialize(bool thread_safe) +void Library_State::initialize() { CPUID::initialize(); - if(mutex_factory) + if(m_algorithm_factory) throw Invalid_State("Library_State has already been initialized"); - if(!thread_safe) - { - mutex_factory = new Noop_Mutex_Factory; - } - else - { -#if defined(BOTAN_HAS_MUTEX_PTHREAD) - mutex_factory = new Pthread_Mutex_Factory; -#elif defined(BOTAN_HAS_MUTEX_WIN32) - mutex_factory = new Win32_Mutex_Factory; -#elif defined(BOTAN_HAS_MUTEX_QT) - mutex_factory Qt_Mutex_Factory; -#else - throw Invalid_State("Could not find a thread-safe mutex object to use"); -#endif - } - - allocator_lock = get_mutex(); - config_lock = get_mutex(); - global_rng_lock = get_mutex(); - + cached_default_allocator = 0; default_allocator_name = has_mlock() ? "locking" : "malloc"; add_allocator(new Malloc_Allocator); - add_allocator(new Locking_Allocator(get_mutex())); + add_allocator(new Locking_Allocator); #if defined(BOTAN_HAS_ALLOC_MMAP) - add_allocator(new MemoryMapping_Allocator(get_mutex())); + add_allocator(new MemoryMapping_Allocator); #endif load_default_config(); - m_algorithm_factory = new Algorithm_Factory(*mutex_factory); + m_algorithm_factory = new Algorithm_Factory(); #if defined(BOTAN_HAS_ENGINE_GNU_MP) algorithm_factory().add_engine(new GMP_Engine); @@ -269,12 +230,9 @@ void Library_State::initialize(bool thread_safe) */ Library_State::Library_State() { - mutex_factory = 0; - allocator_lock = config_lock = 0; cached_default_allocator = 0; m_algorithm_factory = 0; - global_rng_lock = 0; global_rng_ptr = 0; } @@ -284,7 +242,11 @@ Library_State::Library_State() Library_State::~Library_State() { delete m_algorithm_factory; + m_algorithm_factory = 0; + delete global_rng_ptr; + global_rng_ptr = 0; + cached_default_allocator = 0; @@ -293,11 +255,6 @@ Library_State::~Library_State() allocators[j]->destroy(); delete allocators[j]; } - - delete global_rng_lock; - delete allocator_lock; - delete mutex_factory; - delete config_lock; } } diff --git a/src/libstate/libstate.h b/src/libstate/libstate.h index aa957c8c9..49908a1e3 100644 --- a/src/libstate/libstate.h +++ b/src/libstate/libstate.h @@ -13,16 +13,15 @@ #include <botan/algo_factory.h> #include <botan/rng.h> +#include <mutex> #include <string> #include <vector> #include <map> namespace Botan { -class Mutex; - -/** -* Global state container aka the buritto at the center of it all +/* +* Global State Container Base */ class BOTAN_DLL Library_State { @@ -30,10 +29,10 @@ class BOTAN_DLL Library_State Library_State(); ~Library_State(); - /** - * @param thread_safe should a mutex be used for serialization - */ - void initialize(bool thread_safe); + Library_State(const Library_State&) = delete; + Library_State& operator=(const Library_State&) = delete; + + void initialize(); /** * @return global Algorithm_Factory @@ -49,7 +48,7 @@ class BOTAN_DLL Library_State * @param name the name of the allocator * @return allocator matching this name, or NULL */ - Allocator* get_allocator(const std::string& name = "") const; + Allocator* get_allocator(const std::string& name = ""); /** * Add a new allocator to the list of available ones @@ -70,7 +69,7 @@ class BOTAN_DLL Library_State * @result the value of the parameter */ std::string get(const std::string& section, - const std::string& key) const; + const std::string& key); /** * Check whether a certain parameter is set or not. @@ -80,7 +79,7 @@ class BOTAN_DLL Library_State * false otherwise */ bool is_set(const std::string& section, - const std::string& key) const; + const std::string& key); /** * Set a configuration parameter. @@ -109,30 +108,20 @@ class BOTAN_DLL Library_State * @param alias the alias to resolve. * @return what the alias stands for */ - std::string deref_alias(const std::string& alias) const; - - /** - * @return newly created Mutex (free with delete) - */ - Mutex* get_mutex() const; + std::string deref_alias(const std::string&); private: static RandomNumberGenerator* make_global_rng(Algorithm_Factory& af, - Mutex* mutex); + std::mutex& mutex); void load_default_config(); - Library_State(const Library_State&) {} - Library_State& operator=(const Library_State&) { return (*this); } - - class Mutex_Factory* mutex_factory; - - Mutex* global_rng_lock; + std::mutex global_rng_lock; RandomNumberGenerator* global_rng_ptr; - Mutex* config_lock; + std::mutex config_lock; std::map<std::string, std::string> config; - Mutex* allocator_lock; + std::mutex allocator_lock; std::string default_allocator_name; std::map<std::string, Allocator*> alloc_factory; mutable Allocator* cached_default_allocator; |