walletdb: Introduce AddRef and RemoveRef functions

Refactor mapFileUseCount increment and decrement to separate functions
AddRef and RemoveRef
This commit is contained in:
Andrew Chow 2020-06-19 20:51:07 -04:00
parent 27b2766384
commit 71d28e7cdc
2 changed files with 24 additions and 7 deletions

View File

@ -334,7 +334,7 @@ BerkeleyDatabase::~BerkeleyDatabase()
} }
} }
BerkeleyBatch::BerkeleyBatch(BerkeleyDatabase& database, const char* pszMode, bool fFlushOnCloseIn) : pdb(nullptr), activeTxn(nullptr), m_cursor(nullptr) BerkeleyBatch::BerkeleyBatch(BerkeleyDatabase& database, const char* pszMode, bool fFlushOnCloseIn) : pdb(nullptr), activeTxn(nullptr), m_cursor(nullptr), m_database(database)
{ {
fReadOnly = (!strchr(pszMode, '+') && !strchr(pszMode, 'w')); fReadOnly = (!strchr(pszMode, '+') && !strchr(pszMode, 'w'));
fFlushOnClose = fFlushOnCloseIn; fFlushOnClose = fFlushOnCloseIn;
@ -408,7 +408,7 @@ BerkeleyBatch::BerkeleyBatch(BerkeleyDatabase& database, const char* pszMode, bo
fReadOnly = fTmp; fReadOnly = fTmp;
} }
} }
++env->mapFileUseCount[strFilename]; database.AddRef();
strFile = strFilename; strFile = strFilename;
} }
} }
@ -446,11 +446,7 @@ void BerkeleyBatch::Close()
if (fFlushOnClose) if (fFlushOnClose)
Flush(); Flush();
{ m_database.RemoveRef();
LOCK(cs_db);
--env->mapFileUseCount[strFile];
}
env->m_db_in_use.notify_all();
} }
void BerkeleyEnvironment::CloseDb(const std::string& strFile) void BerkeleyEnvironment::CloseDb(const std::string& strFile)
@ -846,6 +842,21 @@ bool BerkeleyBatch::HasKey(CDataStream&& key)
return ret == 0; return ret == 0;
} }
void BerkeleyDatabase::AddRef()
{
LOCK(cs_db);
++env->mapFileUseCount[strFile];
}
void BerkeleyDatabase::RemoveRef()
{
{
LOCK(cs_db);
--env->mapFileUseCount[strFile];
}
env->m_db_in_use.notify_all();
}
std::unique_ptr<BerkeleyBatch> BerkeleyDatabase::MakeBatch(const char* mode, bool flush_on_close) std::unique_ptr<BerkeleyBatch> BerkeleyDatabase::MakeBatch(const char* mode, bool flush_on_close)
{ {
return MakeUnique<BerkeleyBatch>(*this, mode, flush_on_close); return MakeUnique<BerkeleyBatch>(*this, mode, flush_on_close);

View File

@ -121,6 +121,11 @@ public:
*/ */
bool Rewrite(const char* pszSkip=nullptr); bool Rewrite(const char* pszSkip=nullptr);
/** Indicate the a new database user has began using the database. */
void AddRef();
/** Indicate that database user has stopped using the database and that it could be flushed or closed. */
void RemoveRef();
/** Back up the entire database to a file. /** Back up the entire database to a file.
*/ */
bool Backup(const std::string& strDest) const; bool Backup(const std::string& strDest) const;
@ -212,6 +217,7 @@ protected:
bool fReadOnly; bool fReadOnly;
bool fFlushOnClose; bool fFlushOnClose;
BerkeleyEnvironment *env; BerkeleyEnvironment *env;
BerkeleyDatabase& m_database;
public: public:
explicit BerkeleyBatch(BerkeleyDatabase& database, const char* pszMode = "r+", bool fFlushOnCloseIn=true); explicit BerkeleyBatch(BerkeleyDatabase& database, const char* pszMode = "r+", bool fFlushOnCloseIn=true);