Merge bitcoin-core/gui#434: Keep InitExecutor in main gui thread

03a5fe06bd85111ef844a30dcfdf3b317ff74517 qt: Keep InitExecutor in main gui thread (João Barbosa)

Pull request description:

  The `InitExecutor` constructor moves the instance to a dedicated thread. This PR changes that by using `GUIUtil::ObjectInvoke` to run the relevant code in that thread.

  A possible follow-up is to ditch the dedicated thread and use `QThreadPool` or even `QtConcurrent::run` (if we want to enable that).

ACKs for top commit:
  hebasto:
    ACK 03a5fe06bd85111ef844a30dcfdf3b317ff74517, tested on Linux Mint 20.2 (Qt 5.12.8).
  jarolrod:
    ACK 03a5fe06bd85111ef844a30dcfdf3b317ff74517

Tree-SHA512: 8b40300371d4c04efb9913600a06ba4899af0b5f50fdb26ea23ec751df6d3bd52f8bd693a5e8f6a94ebf3790583dc96c6070e6878d247dece62347aa9bd99031
This commit is contained in:
Hennadii Stepanov 2021-09-28 23:19:55 +03:00
commit f000cdcf0a
No known key found for this signature in database
GPG Key ID: 410108112E7EA81F
3 changed files with 28 additions and 23 deletions

View File

@ -5,6 +5,7 @@
#include <qt/initexecutor.h> #include <qt/initexecutor.h>
#include <interfaces/node.h> #include <interfaces/node.h>
#include <qt/guiutil.h>
#include <util/system.h> #include <util/system.h>
#include <util/threadnames.h> #include <util/threadnames.h>
@ -18,7 +19,7 @@
InitExecutor::InitExecutor(interfaces::Node& node) InitExecutor::InitExecutor(interfaces::Node& node)
: QObject(), m_node(node) : QObject(), m_node(node)
{ {
this->moveToThread(&m_thread); m_context.moveToThread(&m_thread);
m_thread.start(); m_thread.start();
} }
@ -38,29 +39,33 @@ void InitExecutor::handleRunawayException(const std::exception* e)
void InitExecutor::initialize() void InitExecutor::initialize()
{ {
try { GUIUtil::ObjectInvoke(&m_context, [this] {
util::ThreadRename("qt-init"); try {
qDebug() << __func__ << ": Running initialization in thread"; util::ThreadRename("qt-init");
interfaces::BlockAndHeaderTipInfo tip_info; qDebug() << "Running initialization in thread";
bool rv = m_node.appInitMain(&tip_info); interfaces::BlockAndHeaderTipInfo tip_info;
Q_EMIT initializeResult(rv, tip_info); bool rv = m_node.appInitMain(&tip_info);
} catch (const std::exception& e) { Q_EMIT initializeResult(rv, tip_info);
handleRunawayException(&e); } catch (const std::exception& e) {
} catch (...) { handleRunawayException(&e);
handleRunawayException(nullptr); } catch (...) {
} handleRunawayException(nullptr);
}
});
} }
void InitExecutor::shutdown() void InitExecutor::shutdown()
{ {
try { GUIUtil::ObjectInvoke(&m_context, [this] {
qDebug() << __func__ << ": Running Shutdown in thread"; try {
m_node.appShutdown(); qDebug() << "Running Shutdown in thread";
qDebug() << __func__ << ": Shutdown finished"; m_node.appShutdown();
Q_EMIT shutdownResult(); qDebug() << "Shutdown finished";
} catch (const std::exception& e) { Q_EMIT shutdownResult();
handleRunawayException(&e); } catch (const std::exception& e) {
} catch (...) { handleRunawayException(&e);
handleRunawayException(nullptr); } catch (...) {
} handleRunawayException(nullptr);
}
});
} }

View File

@ -40,6 +40,7 @@ private:
void handleRunawayException(const std::exception* e); void handleRunawayException(const std::exception* e);
interfaces::Node& m_node; interfaces::Node& m_node;
QObject m_context;
QThread m_thread; QThread m_thread;
}; };

View File

@ -9,7 +9,6 @@
#include <interfaces/init.h> #include <interfaces/init.h>
#include <interfaces/node.h> #include <interfaces/node.h>
#include <qt/bitcoin.h> #include <qt/bitcoin.h>
#include <qt/initexecutor.h>
#include <qt/test/apptests.h> #include <qt/test/apptests.h>
#include <qt/test/rpcnestedtests.h> #include <qt/test/rpcnestedtests.h>
#include <qt/test/uritests.h> #include <qt/test/uritests.h>