From bba7c249296a9a2f444e1035fef8f8b593ba2aaf Mon Sep 17 00:00:00 2001
From: Gregory Maxwell <greg@xiph.org>
Date: Tue, 28 Apr 2015 17:00:50 -0700
Subject: Avoid crash on start in TestBlockValidity with gen=1.

When the internal miner is enabled at the start of a new node, there
 is an near instant assert in TestBlockValidity because its attempting
 to mine a block before the top checkpoint.

Also avoids a data race around vNodes.
---
 src/miner.cpp | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/src/miner.cpp b/src/miner.cpp
index 56a2c5828b..4bceb7d7b4 100644
--- a/src/miner.cpp
+++ b/src/miner.cpp
@@ -453,8 +453,16 @@ void static BitcoinMiner(CWallet *pwallet)
             if (chainparams.MiningRequiresPeers()) {
                 // Busy-wait for the network to come online so we don't waste time mining
                 // on an obsolete chain. In regtest mode we expect to fly solo.
-                while (vNodes.empty())
+                do {
+                    bool fvNodesEmpty;
+                    {
+                        LOCK(cs_vNodes);
+                        fvNodesEmpty = vNodes.empty();
+                    }
+                    if (!fvNodesEmpty && !IsInitialBlockDownload())
+                        break;
                     MilliSleep(1000);
+                } while (true);
             }
 
             //
@@ -533,6 +541,11 @@ void static BitcoinMiner(CWallet *pwallet)
         LogPrintf("BitcoinMiner terminated\n");
         throw;
     }
+    catch (const std::runtime_error &e)
+    {
+        LogPrintf("BitcoinMiner runtime error: %s\n", e.what());
+        return;
+    }
 }
 
 void GenerateBitcoins(bool fGenerate, CWallet* pwallet, int nThreads)
-- 
cgit v1.2.3