diff --git a/src/db.cpp b/src/db.cpp index 08b66141..f0addda9 100644 --- a/src/db.cpp +++ b/src/db.cpp @@ -27,8 +27,6 @@ unsigned int nWalletDBUpdated; // CDBEnv bitdb; -map mapFileUseCount; -static map mapDb; void CDBEnv::EnvShutdown() { @@ -129,8 +127,8 @@ CDB::CDB(const char *pszFile, const char* pszMode) : throw runtime_error("env open failed"); strFile = pszFile; - ++mapFileUseCount[strFile]; - pdb = mapDb[strFile]; + ++bitdb.mapFileUseCount[strFile]; + pdb = bitdb.mapDb[strFile]; if (pdb == NULL) { pdb = new Db(&bitdb.dbenv, 0); @@ -148,7 +146,7 @@ CDB::CDB(const char *pszFile, const char* pszMode) : pdb = NULL; { LOCK(bitdb.cs_db); - --mapFileUseCount[strFile]; + --bitdb.mapFileUseCount[strFile]; } strFile = ""; throw runtime_error(strprintf("CDB() : can't open database file %s, error %d", pszFile, ret)); @@ -162,7 +160,7 @@ CDB::CDB(const char *pszFile, const char* pszMode) : fReadOnly = fTmp; } - mapDb[strFile] = pdb; + bitdb.mapDb[strFile] = pdb; } } } @@ -189,14 +187,14 @@ void CDB::Close() { LOCK(bitdb.cs_db); - --mapFileUseCount[strFile]; + --bitdb.mapFileUseCount[strFile]; } } -void CloseDb(const string& strFile) +void CDBEnv::CloseDb(const string& strFile) { { - LOCK(bitdb.cs_db); + LOCK(cs_db); if (mapDb[strFile] != NULL) { // Close the database handle @@ -214,12 +212,12 @@ bool CDB::Rewrite(const string& strFile, const char* pszSkip) { { LOCK(bitdb.cs_db); - if (!mapFileUseCount.count(strFile) || mapFileUseCount[strFile] == 0) + if (!bitdb.mapFileUseCount.count(strFile) || bitdb.mapFileUseCount[strFile] == 0) { // Flush log data to the dat file - CloseDb(strFile); + bitdb.CloseDb(strFile); bitdb.CheckpointLSN(strFile); - mapFileUseCount.erase(strFile); + bitdb.mapFileUseCount.erase(strFile); bool fSuccess = true; printf("Rewriting %s...\n", strFile.c_str()); @@ -276,7 +274,7 @@ bool CDB::Rewrite(const string& strFile, const char* pszSkip) if (fSuccess) { db.Close(); - CloseDb(strFile); + bitdb.CloseDb(strFile); if (pdbCopy->close(0)) fSuccess = false; delete pdbCopy; diff --git a/src/db.h b/src/db.h index 7af4d5e1..abc58c4b 100644 --- a/src/db.h +++ b/src/db.h @@ -42,6 +42,8 @@ private: public: mutable CCriticalSection cs_db; DbEnv dbenv; + std::map mapFileUseCount; + std::map mapDb; CDBEnv(); ~CDBEnv(); @@ -51,6 +53,8 @@ public: void CheckpointLSN(std::string strFile); void SetDetach(bool fDetachDB_) { fDetachDB = fDetachDB_; } + void CloseDb(const std::string& strFile); + DbTxn *TxnBegin(int flags=DB_TXN_WRITE_NOSYNC) { DbTxn* ptxn = NULL; diff --git a/src/walletdb.cpp b/src/walletdb.cpp index 4bdb7e23..84dedbc8 100644 --- a/src/walletdb.cpp +++ b/src/walletdb.cpp @@ -13,9 +13,6 @@ using namespace boost; static uint64 nAccountingEntryNumber = 0; -extern map mapFileUseCount; -extern void CloseDb(const string& strFile); - // // CWalletDB // @@ -354,8 +351,8 @@ void ThreadFlushWalletDB(void* parg) { // Don't do this if any databases are in use int nRefCount = 0; - map::iterator mi = mapFileUseCount.begin(); - while (mi != mapFileUseCount.end()) + map::iterator mi = bitdb.mapFileUseCount.begin(); + while (mi != bitdb.mapFileUseCount.end()) { nRefCount += (*mi).second; mi++; @@ -363,18 +360,18 @@ void ThreadFlushWalletDB(void* parg) if (nRefCount == 0 && !fShutdown) { - map::iterator mi = mapFileUseCount.find(strFile); - if (mi != mapFileUseCount.end()) + map::iterator mi = bitdb.mapFileUseCount.find(strFile); + if (mi != bitdb.mapFileUseCount.end()) { printf("Flushing wallet.dat\n"); nLastFlushed = nWalletDBUpdated; int64 nStart = GetTimeMillis(); // Flush wallet.dat so it's self contained - CloseDb(strFile); + bitdb.CloseDb(strFile); bitdb.CheckpointLSN(strFile); - mapFileUseCount.erase(mi++); + bitdb.mapFileUseCount.erase(mi++); printf("Flushed wallet.dat %"PRI64d"ms\n", GetTimeMillis() - nStart); } } @@ -391,12 +388,12 @@ bool BackupWallet(const CWallet& wallet, const string& strDest) { { LOCK(bitdb.cs_db); - if (!mapFileUseCount.count(wallet.strWalletFile) || mapFileUseCount[wallet.strWalletFile] == 0) + if (!bitdb.mapFileUseCount.count(wallet.strWalletFile) || bitdb.mapFileUseCount[wallet.strWalletFile] == 0) { // Flush log data to the dat file - CloseDb(wallet.strWalletFile); + bitdb.CloseDb(wallet.strWalletFile); bitdb.CheckpointLSN(wallet.strWalletFile); - mapFileUseCount.erase(wallet.strWalletFile); + bitdb.mapFileUseCount.erase(wallet.strWalletFile); // Copy wallet.dat filesystem::path pathSrc = GetDataDir() / wallet.strWalletFile;