diff --git a/src/bitcoinrpc.cpp b/src/bitcoinrpc.cpp index 999c6dda0..8c3a615fd 100644 --- a/src/bitcoinrpc.cpp +++ b/src/bitcoinrpc.cpp @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include typedef boost::asio::ssl::stream SSLStream; @@ -436,7 +436,7 @@ Value stop(const Array& params, bool fHelp) "stop\n" "Stop Bitcoin server."); // Shutdown will take long enough that the response should get back - uiInterface.QueueShutdown(); + StartShutdown(); return "Bitcoin server stopping"; } @@ -1148,7 +1148,7 @@ Value sendmany(const Array& params, bool fHelp) CScript scriptPubKey; scriptPubKey.SetDestination(address.Get()); - int64 nAmount = AmountFromValue(s.value_); + int64 nAmount = AmountFromValue(s.value_); totalAmount += nAmount; vecSend.push_back(make_pair(scriptPubKey, nAmount)); @@ -1524,7 +1524,7 @@ Value listtransactions(const Array& params, bool fHelp) if ((int)ret.size() >= (nCount+nFrom)) break; } // ret is newest to oldest - + if (nFrom > (int)ret.size()) nFrom = ret.size(); if ((nFrom + nCount) > (int)ret.size()) @@ -1935,7 +1935,7 @@ Value encryptwallet(const Array& params, bool fHelp) // BDB seems to have a bad habit of writing old data into // slack space in .dat files; that is bad if the old data is // unencrypted private keys. So: - uiInterface.QueueShutdown(); + StartShutdown(); return "wallet encrypted; Bitcoin server stopping, restart to run with encrypted wallet"; } @@ -2682,7 +2682,7 @@ void ThreadRPCServer2(void* parg) GetConfigFile().string().c_str(), EncodeBase58(&rand_pwd[0],&rand_pwd[0]+32).c_str()), _("Error"), CClientUIInterface::OK | CClientUIInterface::MODAL); - uiInterface.QueueShutdown(); + StartShutdown(); return; } @@ -2703,7 +2703,7 @@ void ThreadRPCServer2(void* parg) { uiInterface.ThreadSafeMessageBox(strprintf(_("An error occured while setting up the RPC port %i for listening: %s"), endpoint.port(), e.what()), _("Error"), CClientUIInterface::OK | CClientUIInterface::MODAL); - uiInterface.QueueShutdown(); + StartShutdown(); return; } diff --git a/src/init.cpp b/src/init.cpp index bf9551e85..08b594f56 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -38,6 +38,17 @@ void ExitTimeout(void* parg) #endif } +void StartShutdown() +{ +#ifdef QT_GUI + // ensure we leave the Qt main loop for a clean GUI exit (Shutdown() is called in bitcoin.cpp afterwards) + uiInterface.QueueShutdown(); +#else + // Without UI, Shutdown() can simply be started in a new thread + CreateThread(Shutdown, NULL); +#endif +} + void Shutdown(void* parg) { static CCriticalSection cs_Shutdown; @@ -66,7 +77,10 @@ void Shutdown(void* parg) Sleep(50); printf("Bitcoin exited\n\n"); fExit = true; +#ifndef QT_GUI + // ensure non UI client get's exited here, but let Bitcoin-Qt reach return 0; in bitcoin.cpp exit(0); +#endif } else { diff --git a/src/init.h b/src/init.h index 6159ededa..8308ee648 100644 --- a/src/init.h +++ b/src/init.h @@ -9,6 +9,7 @@ extern CWallet* pwalletMain; +void StartShutdown(); void Shutdown(void* parg); bool AppInit2(); std::string HelpMessage(); diff --git a/src/main.cpp b/src/main.cpp index 50a740d16..fa3eb592a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1875,7 +1875,7 @@ bool CheckDiskSpace(uint64 nAdditionalBytes) strMiscWarning = strMessage; printf("*** %s\n", strMessage.c_str()); uiInterface.ThreadSafeMessageBox(strMessage, "Bitcoin", CClientUIInterface::OK | CClientUIInterface::ICON_EXCLAMATION | CClientUIInterface::MODAL); - uiInterface.QueueShutdown(); + StartShutdown(); return false; } return true; diff --git a/src/net.cpp b/src/net.cpp index d51070908..804cb0f54 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -1658,7 +1658,7 @@ void ThreadMessageHandler2(void* parg) vnThreadsRunning[THREAD_MESSAGEHANDLER]--; Sleep(100); if (fRequestShutdown) - Shutdown(NULL); + StartShutdown(); vnThreadsRunning[THREAD_MESSAGEHANDLER]++; if (fShutdown) return; diff --git a/src/noui.cpp b/src/noui.cpp index 3ba7e729f..db25f2d28 100644 --- a/src/noui.cpp +++ b/src/noui.cpp @@ -20,16 +20,9 @@ static bool noui_ThreadSafeAskFee(int64 nFeeRequired, const std::string& strCapt return true; } -static void noui_QueueShutdown() -{ - // Without UI, Shutdown can simply be started in a new thread - CreateThread(Shutdown, NULL); -} - void noui_connect() { // Connect bitcoind signal handlers uiInterface.ThreadSafeMessageBox.connect(noui_ThreadSafeMessageBox); uiInterface.ThreadSafeAskFee.connect(noui_ThreadSafeAskFee); - uiInterface.QueueShutdown.connect(noui_QueueShutdown); } diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index 2a2d20039..8c8c73f06 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -290,6 +290,7 @@ int main(int argc, char *argv[]) window.setWalletModel(0); guiref = 0; } + // Shutdown the core and it's threads, but don't exit Bitcoin-Qt here Shutdown(NULL); } else