Use a signal to continue init after genesis activation
This commit is contained in:
38
src/init.cpp
38
src/init.cpp
@@ -521,6 +521,21 @@ static void BlockNotifyCallback(bool initialSync, const CBlockIndex *pBlockIndex
|
||||
boost::thread t(runCommand, strCmd); // thread runs free
|
||||
}
|
||||
|
||||
static bool fHaveGenesis = false;
|
||||
static boost::mutex cs_GenesisWait;
|
||||
static CConditionVariable condvar_GenesisWait;
|
||||
|
||||
static void BlockNotifyGenesisWait(bool, const CBlockIndex *pBlockIndex)
|
||||
{
|
||||
if (pBlockIndex != NULL) {
|
||||
{
|
||||
boost::unique_lock<boost::mutex> lock_GenesisWait(cs_GenesisWait);
|
||||
fHaveGenesis = true;
|
||||
}
|
||||
condvar_GenesisWait.notify_all();
|
||||
}
|
||||
}
|
||||
|
||||
struct CImportingNow
|
||||
{
|
||||
CImportingNow() {
|
||||
@@ -1454,6 +1469,14 @@ bool AppInit2(Config& config, boost::thread_group& threadGroup, CScheduler& sche
|
||||
|
||||
// ********************************************************* Step 10: import blocks
|
||||
|
||||
// Either install a handler to notify us when genesis activates, or set fHaveGenesis directly.
|
||||
// No locking, as this happens before any background thread is started.
|
||||
if (chainActive.Tip() == NULL) {
|
||||
uiInterface.NotifyBlockTip.connect(BlockNotifyGenesisWait);
|
||||
} else {
|
||||
fHaveGenesis = true;
|
||||
}
|
||||
|
||||
if (mapArgs.count("-blocknotify"))
|
||||
uiInterface.NotifyBlockTip.connect(BlockNotifyCallback);
|
||||
|
||||
@@ -1463,19 +1486,16 @@ bool AppInit2(Config& config, boost::thread_group& threadGroup, CScheduler& sche
|
||||
BOOST_FOREACH(const std::string& strFile, mapMultiArgs["-loadblock"])
|
||||
vImportFiles.push_back(strFile);
|
||||
}
|
||||
|
||||
threadGroup.create_thread(boost::bind(&ThreadImport, vImportFiles));
|
||||
|
||||
// Wait for genesis block to be processed
|
||||
bool fHaveGenesis = false;
|
||||
while (!fHaveGenesis && !fRequestShutdown) {
|
||||
{
|
||||
LOCK(cs_main);
|
||||
fHaveGenesis = (chainActive.Tip() != NULL);
|
||||
}
|
||||
|
||||
if (!fHaveGenesis) {
|
||||
MilliSleep(10);
|
||||
{
|
||||
boost::unique_lock<boost::mutex> lock(cs_GenesisWait);
|
||||
while (!fHaveGenesis) {
|
||||
condvar_GenesisWait.wait(lock);
|
||||
}
|
||||
uiInterface.NotifyBlockTip.disconnect(BlockNotifyGenesisWait);
|
||||
}
|
||||
|
||||
// ********************************************************* Step 11: start node
|
||||
|
||||
Reference in New Issue
Block a user