Clean up exit memory leaks in NodeStore

This commit is contained in:
Vinnie Falco
2013-09-17 19:38:18 -07:00
parent 237093dcd3
commit 7c39867d56
16 changed files with 77 additions and 58 deletions

View File

@@ -217,11 +217,9 @@ SqliteBackendFactory::~SqliteBackendFactory ()
{
}
SqliteBackendFactory& SqliteBackendFactory::getInstance ()
SqliteBackendFactory* SqliteBackendFactory::getInstance ()
{
static SqliteBackendFactory instance;
return instance;
return new SqliteBackendFactory;
}
String SqliteBackendFactory::getName () const

View File

@@ -20,7 +20,7 @@ private:
~SqliteBackendFactory ();
public:
static SqliteBackendFactory& getInstance ();
static SqliteBackendFactory* getInstance ();
String getName () const;

View File

@@ -220,11 +220,9 @@ HyperLevelDBBackendFactory::~HyperLevelDBBackendFactory ()
{
}
HyperLevelDBBackendFactory& HyperLevelDBBackendFactory::getInstance ()
HyperLevelDBBackendFactory* HyperLevelDBBackendFactory::getInstance ()
{
static HyperLevelDBBackendFactory instance;
return instance;
return new HyperLevelDBBackendFactory;
}
String HyperLevelDBBackendFactory::getName () const

View File

@@ -22,7 +22,7 @@ private:
~HyperLevelDBBackendFactory ();
public:
static HyperLevelDBBackendFactory& getInstance ();
static HyperLevelDBBackendFactory* getInstance ();
String getName () const;

View File

@@ -155,11 +155,9 @@ KeyvaDBBackendFactory::~KeyvaDBBackendFactory ()
{
}
KeyvaDBBackendFactory& KeyvaDBBackendFactory::getInstance ()
KeyvaDBBackendFactory* KeyvaDBBackendFactory::getInstance ()
{
static KeyvaDBBackendFactory instance;
return instance;
return new KeyvaDBBackendFactory;
}
String KeyvaDBBackendFactory::getName () const

View File

@@ -20,7 +20,7 @@ private:
~KeyvaDBBackendFactory ();
public:
static KeyvaDBBackendFactory& getInstance ();
static KeyvaDBBackendFactory* getInstance ();
String getName () const;

View File

@@ -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 <leveldb::Cache*> (m_lruCache));
delete cache;
}
LevelDBBackendFactory& LevelDBBackendFactory::getInstance ()
LevelDBBackendFactory* LevelDBBackendFactory::getInstance ()
{
static LevelDBBackendFactory instance;
return instance;
return new LevelDBBackendFactory;
}
String LevelDBBackendFactory::getName () const

View File

@@ -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

View File

@@ -256,11 +256,9 @@ MdbBackendFactory::~MdbBackendFactory ()
{
}
MdbBackendFactory& MdbBackendFactory::getInstance ()
MdbBackendFactory* MdbBackendFactory::getInstance ()
{
static MdbBackendFactory instance;
return instance;
return new MdbBackendFactory;
}
String MdbBackendFactory::getName () const

View File

@@ -24,7 +24,7 @@ private:
~MdbBackendFactory ();
public:
static MdbBackendFactory& getInstance ();
static MdbBackendFactory* getInstance ();
String getName () const;

View File

@@ -89,11 +89,9 @@ MemoryBackendFactory::~MemoryBackendFactory ()
{
}
MemoryBackendFactory& MemoryBackendFactory::getInstance ()
MemoryBackendFactory* MemoryBackendFactory::getInstance ()
{
static MemoryBackendFactory instance;
return instance;
return new MemoryBackendFactory;
}
String MemoryBackendFactory::getName () const

View File

@@ -20,7 +20,7 @@ private:
~MemoryBackendFactory ();
public:
static MemoryBackendFactory& getInstance ();
static MemoryBackendFactory* getInstance ();
String getName () const;

View File

@@ -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 <Factories>::get (
SingletonLifetime::persistAfterCreation);
}
private:
OwnedArray <Factory> 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 <NodeStore::BackendFactory*> 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 ());

View File

@@ -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.

View File

@@ -53,11 +53,9 @@ NullBackendFactory::~NullBackendFactory ()
{
}
NullBackendFactory& NullBackendFactory::getInstance ()
NullBackendFactory* NullBackendFactory::getInstance ()
{
static NullBackendFactory instance;
return instance;
return new NullBackendFactory;
}
String NullBackendFactory::getName () const

View File

@@ -22,7 +22,7 @@ private:
~NullBackendFactory ();
public:
static NullBackendFactory& getInstance ();
static NullBackendFactory* getInstance ();
String getName () const;