condQuit.wait(lock);
}
- friend class CCheckQueueControl<T>;
+ ~CCheckQueue() {
+ Quit();
+ }
+
+ bool IsIdle()
+ {
+ boost::unique_lock<boost::mutex> lock(mutex);
+ return (nTotal == nIdle && nTodo == 0 && fAllOk == true);
+ }
};
/** RAII-style controller object for a CCheckQueue that guarantees the passed
CCheckQueueControl(CCheckQueue<T> *pqueueIn) : pqueue(pqueueIn), fDone(false) {
// passed queue is supposed to be unused, or NULL
if (pqueue != NULL) {
- assert(pqueue->nTotal == pqueue->nIdle);
- assert(pqueue->nTodo == 0);
- assert(pqueue->fAllOk == true);
+ bool isIdle = pqueue->IsIdle();
+ assert(isIdle);
}
}
if (fFirstThread)
{
fShutdown = true;
+ fRequestShutdown = true;
nTransactionsUpdated++;
// CTxDB().Close();
bitdb.Flush(false);
return false;
}
- uiInterface.InitMessage(_("Loading block index..."));
+
printf("Loading block index...\n");
- nStart = GetTimeMillis();
- if (!LoadBlockIndex())
- return InitError(_("Error loading blkindex.dat"));
+ bool fLoaded = false;
+ while (!fLoaded) {
+ std::string strLoadError;
+ uiInterface.InitMessage(_("Loading block index..."));
+
+ nStart = GetTimeMillis();
+ do {
+ try {
+ UnloadBlockIndex();
+
+ if (!LoadBlockIndex()) {
+ strLoadError = _("Error loading block database");
+ break;
+ }
+ } catch(std::exception &e) {
+ strLoadError = _("Error opening block database");
+ break;
+ }
+
+ fLoaded = true;
+ } while(false);
+ if (!fLoaded) {
+ // TODO: suggest reindex here
+ return InitError(strLoadError);
+ }
+ }
// as LoadBlockIndex can take several minutes, it's possible the user
// requested to kill bitcoin-qt during the last operation. If so, exit.
}
}
+void UnloadBlockIndex()
+{
+ mapBlockIndex.clear();
+ setStakeSeen.clear();
+ pindexGenesisBlock = NULL;
+ nBestHeight = 0;
+ nBestChainTrust = 0;
+ nBestInvalidTrust = 0;
+ hashBestChain = 0;
+ pindexBest = NULL;
+}
+
bool LoadBlockIndex(bool fAllowNew)
{
if (fTestNet)
bool CheckDiskSpace(uint64_t nAdditionalBytes=0);
FILE* OpenBlockFile(unsigned int nFile, unsigned int nBlockPos, const char* pszMode="rb");
FILE* AppendBlockFile(unsigned int& nFileRet);
+
+void UnloadBlockIndex();
bool LoadBlockIndex(bool fAllowNew=true);
void PrintBlockTree();
CBlockIndex* FindBlockByHeight(int nHeight);