mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-02-03 22:03:01 +01:00
Bugfix: Fix various places where Bitcoin-Qt was being shutdown improperly
(Partial/merge of upstream9247134eab,1a3f0da922, and3e34352222)
This commit is contained in:
committed by
Luke Dashjr
parent
0b1fda6f65
commit
276cfd8530
@@ -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
|
||||
|
||||
11
src/init.cpp
11
src/init.cpp
@@ -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;
|
||||
|
||||
@@ -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[]);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -1705,7 +1705,7 @@ void ThreadMessageHandler2(void* parg)
|
||||
vnThreadsRunning[2]--;
|
||||
Sleep(100);
|
||||
if (fRequestShutdown)
|
||||
Shutdown(NULL);
|
||||
StartShutdown();
|
||||
vnThreadsRunning[2]++;
|
||||
if (fShutdown)
|
||||
return;
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
CWallet* pwalletMain;
|
||||
|
||||
void Shutdown(void* parg)
|
||||
void StartShutdown()
|
||||
{
|
||||
exit(0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user