diff --git a/src/ripple_app/node/SqliteBackendFactory.cpp b/src/ripple_app/node/SqliteBackendFactory.cpp index 306407357..55ed7a012 100644 --- a/src/ripple_app/node/SqliteBackendFactory.cpp +++ b/src/ripple_app/node/SqliteBackendFactory.cpp @@ -217,11 +217,9 @@ SqliteBackendFactory::~SqliteBackendFactory () { } -SqliteBackendFactory& SqliteBackendFactory::getInstance () +SqliteBackendFactory* SqliteBackendFactory::getInstance () { - static SqliteBackendFactory instance; - - return instance; + return new SqliteBackendFactory; } String SqliteBackendFactory::getName () const diff --git a/src/ripple_app/node/SqliteBackendFactory.h b/src/ripple_app/node/SqliteBackendFactory.h index 0b1c37380..1c3889cdf 100644 --- a/src/ripple_app/node/SqliteBackendFactory.h +++ b/src/ripple_app/node/SqliteBackendFactory.h @@ -20,7 +20,7 @@ private: ~SqliteBackendFactory (); public: - static SqliteBackendFactory& getInstance (); + static SqliteBackendFactory* getInstance (); String getName () const; diff --git a/src/ripple_core/node/HyperLevelDBBackendFactory.cpp b/src/ripple_core/node/HyperLevelDBBackendFactory.cpp index 220591a1c..d1ac79384 100644 --- a/src/ripple_core/node/HyperLevelDBBackendFactory.cpp +++ b/src/ripple_core/node/HyperLevelDBBackendFactory.cpp @@ -220,11 +220,9 @@ HyperLevelDBBackendFactory::~HyperLevelDBBackendFactory () { } -HyperLevelDBBackendFactory& HyperLevelDBBackendFactory::getInstance () +HyperLevelDBBackendFactory* HyperLevelDBBackendFactory::getInstance () { - static HyperLevelDBBackendFactory instance; - - return instance; + return new HyperLevelDBBackendFactory; } String HyperLevelDBBackendFactory::getName () const diff --git a/src/ripple_core/node/HyperLevelDBBackendFactory.h b/src/ripple_core/node/HyperLevelDBBackendFactory.h index d930b9e36..1d8338f3e 100644 --- a/src/ripple_core/node/HyperLevelDBBackendFactory.h +++ b/src/ripple_core/node/HyperLevelDBBackendFactory.h @@ -22,7 +22,7 @@ private: ~HyperLevelDBBackendFactory (); public: - static HyperLevelDBBackendFactory& getInstance (); + static HyperLevelDBBackendFactory* getInstance (); String getName () const; diff --git a/src/ripple_core/node/KeyvaDBBackendFactory.cpp b/src/ripple_core/node/KeyvaDBBackendFactory.cpp index 63edfab51..d1d91d01c 100644 --- a/src/ripple_core/node/KeyvaDBBackendFactory.cpp +++ b/src/ripple_core/node/KeyvaDBBackendFactory.cpp @@ -155,11 +155,9 @@ KeyvaDBBackendFactory::~KeyvaDBBackendFactory () { } -KeyvaDBBackendFactory& KeyvaDBBackendFactory::getInstance () +KeyvaDBBackendFactory* KeyvaDBBackendFactory::getInstance () { - static KeyvaDBBackendFactory instance; - - return instance; + return new KeyvaDBBackendFactory; } String KeyvaDBBackendFactory::getName () const diff --git a/src/ripple_core/node/KeyvaDBBackendFactory.h b/src/ripple_core/node/KeyvaDBBackendFactory.h index 4124f64a2..a4e64fae6 100644 --- a/src/ripple_core/node/KeyvaDBBackendFactory.h +++ b/src/ripple_core/node/KeyvaDBBackendFactory.h @@ -20,7 +20,7 @@ private: ~KeyvaDBBackendFactory (); public: - static KeyvaDBBackendFactory& getInstance (); + static KeyvaDBBackendFactory* getInstance (); String getName () const; diff --git a/src/ripple_core/node/LevelDBBackendFactory.cpp b/src/ripple_core/node/LevelDBBackendFactory.cpp index 0fd35c6dc..0e6035230 100644 --- a/src/ripple_core/node/LevelDBBackendFactory.cpp +++ b/src/ripple_core/node/LevelDBBackendFactory.cpp @@ -213,22 +213,25 @@ private: //------------------------------------------------------------------------------ LevelDBBackendFactory::LevelDBBackendFactory () + : m_lruCache (nullptr) { leveldb::Options options; options.create_if_missing = true; - options.block_cache = leveldb::NewLRUCache (getConfig ().getSize ( - siHashNodeDBCache) * 1024 * 1024); + options.block_cache = leveldb::NewLRUCache ( + getConfig ().getSize (siHashNodeDBCache) * 1024 * 1024); + + m_lruCache = options.block_cache; } LevelDBBackendFactory::~LevelDBBackendFactory () { + leveldb::Cache* cache (reinterpret_cast (m_lruCache)); + delete cache; } -LevelDBBackendFactory& LevelDBBackendFactory::getInstance () +LevelDBBackendFactory* LevelDBBackendFactory::getInstance () { - static LevelDBBackendFactory instance; - - return instance; + return new LevelDBBackendFactory; } String LevelDBBackendFactory::getName () const diff --git a/src/ripple_core/node/LevelDBBackendFactory.h b/src/ripple_core/node/LevelDBBackendFactory.h index a58f270a2..f8ab4f753 100644 --- a/src/ripple_core/node/LevelDBBackendFactory.h +++ b/src/ripple_core/node/LevelDBBackendFactory.h @@ -20,13 +20,16 @@ private: ~LevelDBBackendFactory (); public: - static LevelDBBackendFactory& getInstance (); + static LevelDBBackendFactory* getInstance (); String getName () const; NodeStore::Backend* createInstance (size_t keyBytes, StringPairArray const& keyValues, NodeStore::Scheduler& scheduler); + +private: + void* m_lruCache; }; #endif diff --git a/src/ripple_core/node/MdbBackendFactory.cpp b/src/ripple_core/node/MdbBackendFactory.cpp index c454380f8..112c09e93 100644 --- a/src/ripple_core/node/MdbBackendFactory.cpp +++ b/src/ripple_core/node/MdbBackendFactory.cpp @@ -256,11 +256,9 @@ MdbBackendFactory::~MdbBackendFactory () { } -MdbBackendFactory& MdbBackendFactory::getInstance () +MdbBackendFactory* MdbBackendFactory::getInstance () { - static MdbBackendFactory instance; - - return instance; + return new MdbBackendFactory; } String MdbBackendFactory::getName () const diff --git a/src/ripple_core/node/MdbBackendFactory.h b/src/ripple_core/node/MdbBackendFactory.h index 4b396e6b6..3a145ee85 100644 --- a/src/ripple_core/node/MdbBackendFactory.h +++ b/src/ripple_core/node/MdbBackendFactory.h @@ -24,7 +24,7 @@ private: ~MdbBackendFactory (); public: - static MdbBackendFactory& getInstance (); + static MdbBackendFactory* getInstance (); String getName () const; diff --git a/src/ripple_core/node/MemoryBackendFactory.cpp b/src/ripple_core/node/MemoryBackendFactory.cpp index 21920845a..d70389255 100644 --- a/src/ripple_core/node/MemoryBackendFactory.cpp +++ b/src/ripple_core/node/MemoryBackendFactory.cpp @@ -89,11 +89,9 @@ MemoryBackendFactory::~MemoryBackendFactory () { } -MemoryBackendFactory& MemoryBackendFactory::getInstance () +MemoryBackendFactory* MemoryBackendFactory::getInstance () { - static MemoryBackendFactory instance; - - return instance; + return new MemoryBackendFactory; } String MemoryBackendFactory::getName () const diff --git a/src/ripple_core/node/MemoryBackendFactory.h b/src/ripple_core/node/MemoryBackendFactory.h index d61c93560..db1edd5f0 100644 --- a/src/ripple_core/node/MemoryBackendFactory.h +++ b/src/ripple_core/node/MemoryBackendFactory.h @@ -20,7 +20,7 @@ private: ~MemoryBackendFactory (); public: - static MemoryBackendFactory& getInstance (); + static MemoryBackendFactory* getInstance (); String getName () const; diff --git a/src/ripple_core/node/NodeStore.cpp b/src/ripple_core/node/NodeStore.cpp index 54573d99c..31d43380d 100644 --- a/src/ripple_core/node/NodeStore.cpp +++ b/src/ripple_core/node/NodeStore.cpp @@ -4,6 +4,45 @@ */ //============================================================================== +// Holds the list of Backend factories +class Factories +{ +public: + typedef NodeStore::BackendFactory Factory; + + Factories () + { + } + + ~Factories () + { + } + + void add (Factory* factory) + { + m_list.add (factory); + } + + Factory* find (String name) const + { + for (int i = 0; i < m_list.size(); ++i) + if (m_list [i]->getName ().compareIgnoreCase (name) == 0) + return m_list [i]; + return nullptr; + } + + static Factories& get () + { + return *SharedSingleton ::get ( + SingletonLifetime::persistAfterCreation); + } + +private: + OwnedArray m_list; +}; + +//------------------------------------------------------------------------------ + NodeStore::DecodedBlob::DecodedBlob (void const* key, void const* value, int valueBytes) { /* Data format: @@ -461,16 +500,7 @@ public: if (type.isNotEmpty ()) { - BackendFactory* factory = nullptr; - - for (int i = 0; i < s_factories.size (); ++i) - { - if (s_factories [i]->getName ().compareIgnoreCase (type) == 0) - { - factory = s_factories [i]; - break; - } - } + BackendFactory* factory (Factories::get().find (type)); if (factory != nullptr) { @@ -489,11 +519,6 @@ public: return backend; } - static void addBackendFactory (BackendFactory& factory) - { - s_factories.add (&factory); - } - //------------------------------------------------------------------------------ private: @@ -516,9 +541,9 @@ Array NodeStoreImp::s_factories; //------------------------------------------------------------------------------ -void NodeStore::addBackendFactory (BackendFactory& factory) +void NodeStore::addBackendFactory (BackendFactory* factory) { - NodeStoreImp::addBackendFactory (factory); + Factories::get().add (factory); } NodeStore::Scheduler& NodeStore::getSynchronousScheduler () @@ -543,6 +568,7 @@ void NodeStore::addAvailableBackends () //NodeStore::addBackendFactory (SqliteBackendFactory::getInstance ()); NodeStore::addBackendFactory (LevelDBBackendFactory::getInstance ()); + NodeStore::addBackendFactory (MemoryBackendFactory::getInstance ()); NodeStore::addBackendFactory (NullBackendFactory::getInstance ()); diff --git a/src/ripple_core/node/NodeStore.h b/src/ripple_core/node/NodeStore.h index ce641f5d2..d96a5d075 100644 --- a/src/ripple_core/node/NodeStore.h +++ b/src/ripple_core/node/NodeStore.h @@ -357,13 +357,12 @@ public: virtual String getName () const = 0; /** Add the specified backend factory to the list of available factories. - The names of available factories are compared against the "type" - value in the parameter list on construction. - + value in the parameter list on construction. Ownership of the object + is transferred. The object must be allocated using new. @param factory The factory to add. */ - static void addBackendFactory (BackendFactory& factory); + static void addBackendFactory (BackendFactory* factory); /** Fetch an object. diff --git a/src/ripple_core/node/NullBackendFactory.cpp b/src/ripple_core/node/NullBackendFactory.cpp index 6a3b000c7..8fab2fa8e 100644 --- a/src/ripple_core/node/NullBackendFactory.cpp +++ b/src/ripple_core/node/NullBackendFactory.cpp @@ -53,11 +53,9 @@ NullBackendFactory::~NullBackendFactory () { } -NullBackendFactory& NullBackendFactory::getInstance () +NullBackendFactory* NullBackendFactory::getInstance () { - static NullBackendFactory instance; - - return instance; + return new NullBackendFactory; } String NullBackendFactory::getName () const diff --git a/src/ripple_core/node/NullBackendFactory.h b/src/ripple_core/node/NullBackendFactory.h index 7b5bab318..2d4bc0dab 100644 --- a/src/ripple_core/node/NullBackendFactory.h +++ b/src/ripple_core/node/NullBackendFactory.h @@ -22,7 +22,7 @@ private: ~NullBackendFactory (); public: - static NullBackendFactory& getInstance (); + static NullBackendFactory* getInstance (); String getName () const;