@ -511,6 +511,21 @@ static void BlockNotifyCallback(bool initialSync, const CBlockIndex *pBlockIndex
@@ -511,6 +511,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 ( ) {
@ -1322,7 +1337,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
@@ -1322,7 +1337,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
break ;
}
if ( ! fReindex ) {
if ( ! fReindex & & chainActive . Tip ( ) ! = NULL ) {
uiInterface . InitMessage ( _ ( " Rewinding blocks... " ) ) ;
if ( ! RewindBlockIndex ( chainparams ) ) {
strLoadError = _ ( " Unable to rewind the database to a pre-fork state. You will need to redownload the blockchain " ) ;
@ -1439,6 +1454,17 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
@@ -1439,6 +1454,17 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
// ********************************************************* Step 10: import blocks
if ( ! CheckDiskSpace ( ) )
return false ;
// 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 ) ;
@ -1448,26 +1474,20 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
@@ -1448,26 +1474,20 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
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
if ( ! CheckDiskSpace ( ) )
return false ;
if ( ! strErrors . str ( ) . empty ( ) )
return InitError ( strErrors . str ( ) ) ;