From 817cd9a1770cccb13b57e2548e75136b64385e88 Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Sat, 4 Jan 2020 14:21:00 +0300 Subject: [PATCH] AppInitMain should quit early and return `false` if shutdown was requested at some point (#3267) This fixes crashes e.g. when user decided to shutdown while rescanning the wallet --- src/init.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/init.cpp b/src/init.cpp index 6e06d08b1..fafc4a88b 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1974,6 +1974,14 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler) LogPrintf("No wallet support compiled in!\n"); #endif + // As InitLoadWallet can take several minutes, it's possible the user + // requested to kill the GUI during the last operation. If so, exit. + if (fRequestShutdown) + { + LogPrintf("Shutdown requested. Exiting.\n"); + return false; + } + // ********************************************************* Step 9: data directory maintenance // if pruning, unset the service bit and perform the initial blockstore prune @@ -1987,6 +1995,14 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler) } } + // As PruneAndFlush can take several minutes, it's possible the user + // requested to kill the GUI during the last operation. If so, exit. + if (fRequestShutdown) + { + LogPrintf("Shutdown requested. Exiting.\n"); + return false; + } + // ********************************************************* Step 10a: Prepare Masternode related stuff fMasternodeMode = false; std::string strMasterNodeBLSPrivKey = gArgs.GetArg("-masternodeblsprivkey", ""); @@ -2139,6 +2155,14 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler) uiInterface.NotifyBlockTip.disconnect(BlockNotifyGenesisWait); } + // As importing blocks can take several minutes, it's possible the user + // requested to kill the GUI during one of the last operations. If so, exit. + if (fRequestShutdown) + { + LogPrintf("Shutdown requested. Exiting.\n"); + return false; + } + // ********************************************************* Step 12: start node //// debug print @@ -2212,5 +2236,12 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler) } #endif + // Final check if the user requested to kill the GUI during one of the last operations. If so, exit. + if (fRequestShutdown) + { + LogPrintf("Shutdown requested. Exiting.\n"); + return false; + } + return true; }