Bugfix: Fix various places where Bitcoin-Qt was being shutdown improperly
authorPhilip Kaufmann <phil.kaufmann@t-online.de>
Mon, 11 Jun 2012 05:40:14 +0000 (07:40 +0200)
committerLuke Dashjr <luke-jr+git@utopios.org>
Thu, 14 Jun 2012 17:53:59 +0000 (17:53 +0000)
(Partial/merge of upstream 9247134eaba9a1d0fa74f22de238af14766630051a3f0da9229a8e524d1010cdc8bd3b9da71fe529, and 3e343522226e6c249f5cb05436eec347b87c6361)

src/bitcoinrpc.cpp
src/init.cpp
src/init.h
src/main.cpp
src/net.cpp
src/qt/bitcoin.cpp
src/qt/bitcoingui.cpp
src/qtui.h
src/test/test_bitcoin.cpp

index 92f2f9e..38f102e 100644 (file)
@@ -165,7 +165,8 @@ Value stop(const Array& params, bool fHelp)
             "Stop bitcoin server.");
 #ifndef QT_GUI
     // Shutdown will take long enough that the response should get back
-    CreateThread(Shutdown, NULL);
+    // NOTE: This should actually work with Bitcoin-Qt too now, but 0.5.0 didn't allow it
+    StartShutdown();
     return "bitcoin server stopping";
 #else
     throw runtime_error("NYI: cannot shut down GUI with RPC command");
@@ -1587,7 +1588,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:
-    CreateThread(Shutdown, NULL);
+    StartShutdown();
     return "wallet encrypted; bitcoin server stopping, restart to run with encrypted wallet";
 }
 
@@ -2173,10 +2174,6 @@ void ThreadRPCServer(void* parg)
     printf("ThreadRPCServer exiting\n");
 }
 
-#ifdef QT_GUI
-extern bool HACK_SHUTDOWN;
-#endif
-
 void ThreadRPCServer2(void* parg)
 {
     printf("ThreadRPCServer started\n");
@@ -2203,7 +2200,7 @@ void ThreadRPCServer2(void* parg)
                 EncodeBase58(&rand_pwd[0],&rand_pwd[0]+32).c_str()),
             _("Error"), wxOK | wxMODAL);
 #ifndef QT_GUI
-        CreateThread(Shutdown, NULL);
+        StartShutdown();
 #endif
         return;
     }
@@ -2228,9 +2225,9 @@ void ThreadRPCServer2(void* parg)
     }
     catch(boost::system::system_error &e)
     {
-        HACK_SHUTDOWN = true;
         ThreadSafeMessageBox(strprintf(_("An error occured while setting up the RPC port %i for listening: %s"), endpoint.port(), e.what()),
                              _("Error"), wxOK | wxMODAL);
+        StartShutdown();
         return;
     }
 #endif
index 6b6a743..31e0551 100644 (file)
@@ -41,6 +41,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)
+    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;
index 2086b31..6bf8466 100644 (file)
@@ -7,6 +7,7 @@
 
 extern CWallet* pwalletMain;
 
+void StartShutdown();
 void Shutdown(void* parg);
 bool AppInit(int argc, char* argv[]);
 bool AppInit2(int argc, char* argv[]);
index 792bbe9..a28d2e8 100644 (file)
@@ -1666,7 +1666,7 @@ bool CheckDiskSpace(uint64 nAdditionalBytes)
         strMiscWarning = strMessage;
         printf("*** %s\n", strMessage.c_str());
         ThreadSafeMessageBox(strMessage, "Bitcoin", wxOK | wxICON_EXCLAMATION);
-        CreateThread(Shutdown, NULL);
+        StartShutdown();
         return false;
     }
     return true;
index e1eea0d..ebdc1cc 100644 (file)
@@ -1705,7 +1705,7 @@ void ThreadMessageHandler2(void* parg)
         vnThreadsRunning[2]--;
         Sleep(100);
         if (fRequestShutdown)
-            Shutdown(NULL);
+            StartShutdown();
         vnThreadsRunning[2]++;
         if (fShutdown)
             return;
index 8dde8f3..6986d39 100644 (file)
@@ -112,6 +112,11 @@ void InitMessage(const std::string &message)
     }
 }
 
+void QueueShutdown()
+{
+    QMetaObject::invokeMethod(QCoreApplication::instance(), "quit", Qt::QueuedConnection);
+}
+
 /*
    Translate string to current locale using Qt.
  */
index 778acd1..2c807a1 100644 (file)
@@ -519,16 +519,12 @@ void BitcoinGUI::refreshStatusBar()
     setNumBlocks(clientModel->getNumBlocks());
 }
 
-bool HACK_SHUTDOWN = false;
-
 void BitcoinGUI::error(const QString &title, const QString &message, bool modal)
 {
     // Report errors from network/worker thread
     if (modal)
     {
         QMessageBox::critical(this, title, message, QMessageBox::Ok, QMessageBox::Ok);
-        if (HACK_SHUTDOWN)
-            QMetaObject::invokeMethod(QCoreApplication::instance(), "quit", Qt::QueuedConnection);
     } else {
         notificator->notify(Notificator::Critical, title, message);
     }
index 8f3e139..52983b8 100644 (file)
@@ -45,6 +45,7 @@ extern bool ThreadSafeAskFee(int64 nFeeRequired, const std::string& strCaption,
 extern void CalledSetStatusBar(const std::string& strText, int nField);
 extern void UIThreadCall(boost::function0<void> fn);
 extern void MainFrameRepaint();
+extern void QueueShutdown();
 extern void InitMessage(const std::string &message);
 extern std::string _(const char* psz);
 
index 39a7c88..ca001b0 100644 (file)
@@ -17,7 +17,7 @@
 
 CWallet* pwalletMain;
 
-void Shutdown(void* parg)
+void StartShutdown()
 {
   exit(0);
 }