Bugfix: Fix various places where Bitcoin-Qt was being shutdown improperly

(Partial/merge of upstream 9247134eab, 1a3f0da922, and 3e34352222)
This commit is contained in:
Philip Kaufmann
2012-06-11 07:40:14 +02:00
committed by Luke Dashjr
parent 0b1fda6f65
commit 276cfd8530
9 changed files with 26 additions and 15 deletions

View 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

View 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;

View 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[]);

View 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;

View File

@@ -1705,7 +1705,7 @@ void ThreadMessageHandler2(void* parg)
vnThreadsRunning[2]--;
Sleep(100);
if (fRequestShutdown)
Shutdown(NULL);
StartShutdown();
vnThreadsRunning[2]++;
if (fShutdown)
return;

View 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.
*/

View 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);
}

View 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);

View File

@@ -17,7 +17,7 @@
CWallet* pwalletMain;
void Shutdown(void* parg)
void StartShutdown()
{
exit(0);
}